C語言插入排序
阿新 • • 發佈:2022-04-22
第一版
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> #define N 10 void quick_sort(int arr[], int start, int end); int partition(int arr[], int low, int high); void select_sort(int arr[],int n); void insert_sort(int arr[], int n); int main() {int i = 0; int arr[N] = {33,9,5,2,5,66,2,1,7,85}; for (int i = 0; i < 10; i++) { printf("%d\t", arr[i]); } printf("\n"); int n = sizeof(arr) / sizeof(arr[0]); insert_sort(arr,n); for (int i = 0; i < 10; i++) { printf("%d\t", arr[i]); } printf("\n"); return 0; } //插入排序 /* 這裡的演算法思想是先對前兩個元素排序,然後從第三個元素開始,與前一個元素比較,如果大於前一個元素,則預設有序,如果 小與前一個元素,則一直項前比較,直到找到大於自己的元素,然後將大於自己元素之後的元素一次後移即可。 */ void insert_sort(int arr[],int n) { if (arr[1]<arr[0]) {//這裡首先排序的原因是發現前兩個元素不適用於下面的通式 int temp = arr[1]; arr[1] = arr[0]; arr[0] = temp; }for (int i = 2; i < n; i++) { int index = i; for (int j = i-1; j >=-1; j--) { if((arr[j]<=arr[i] && arr[i]<arr[i-1]) || (j==-1 && arr[j+1] > arr[i])) {//這裡的第一個條件是通用的,第二個條件是當前元素小於他前面的所有元素的考慮 int temp = arr[i]; while (index>j+1) { arr[index] = arr[index-1]; index--; } arr[j+1] = temp; break; } } } }
改進版
//插入排序 /* 這裡是從前往後找合適的元素,和第一種從後往前匹配相反,因為是按升序排列,在某些情況下,第一種更快速高效 */ void insert_sort1(int arr[], int n) { for (int i = 1; i < n;i++) { int j = 0; while (arr[j]<arr[i] && j<i) { j++; } if (i!=j) { int temp = arr[i]; for (int k = i; k > j;k--) { arr[k] = arr[k - 1]; } arr[j] = temp; } } }