1 #include <stdio.h> 2 3 // 直接插入排序 4 void insert_sort(int sz[], int len) 5 { 6 for (int i = 2; i < len + 1; i++) 7 { 8 if (sz[i] < sz[i - 1]) // 如果应该放在当前位置之前 9 { 10 // 位置0作为哨兵 11 sz[0] = sz[i]; 12 int j; 13 // 寻找该插入的位置 14 for (j = i - 1; sz[j] > sz[0]; j--) 15 { 16 sz[j + 1] = sz[j]; 17 } 18 sz[j + 1] = sz[0]; 19 } 20 } 21 } 22 // 折半查找插入排序 23 void half_insert_sort(int sz[], int len) 24 { 25 for (int i = 2; i < len + 1; i++) 26 { 27 // 位置0作为哨兵 28 sz[0] = sz[i]; 29 // 折半查找该插入的位置 30 int low = 1, high = i - 1; 31 while (low <= high) 32 { 33 int mid = (low + high) >> 1; 34 if (sz[0] < sz[mid]) 35 high = mid - 1; 36 else 37 low = mid + 1; 38 } 39 for (int j = i - 1; j >= high + 1; j--) 40 sz[j + 1] = sz[j]; 41 sz[high + 1] = sz[0]; 42 } 43 } 44 45 int main() 46 { 47 // 0位置未用作为哨兵,待排序数组 48 int a[] = {0, 5, 10, 8, 100, 50, -10, 60}; 49 insert_sort(a, 7); // 7为数组实际长度 50 //half_insert_sort(a, 7); 51 // 输出排序结果 52 for (int i = 1; i < 8; i++) 53 { 54 printf("%d%c", a[i], i == 7 ? '\n' : ' '); 55 } 56 return 0; 57 }