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 }