插入类排序
一、直接插入排序(Straight Insertion Sort)
1.时间复杂度:O(n2)
2.空间复杂度:O(1)
3.实现:
1 void InsertSort(int* a, int num) { 2 int i, j; 3 for (i = 2; i < num; i++) { 4 if (a[i] < a[i - 1]) { 5 a[0] = a[i];//复制为哨兵 6 a[i] = a[i - 1]; 7 for (j = i - 2; a[j] > a[0]; j--) { 8 a[j + 1] = a[j];//记录后移 9 } 10 a[j + 1] = a[0];//插入到正确位置 11 } 12 } 13 }
二、折半插入排序(Binary Insertion Sort)
1.时间复杂度:O(n2)
2.空间复杂度:O(1)
3.实现:
1 void BinaryInsertSort(int* a, int num) { 2 int i, j, low, mid, high; 3 for (i = 2; i < num; i++) { 4 if (a[i] < a[i - 1]) { 5 a[0] = a[i]; 6 low = 1;//折半查找插入位置 7 high = i - 1; 8 while (high >= low) { 9 mid = (high + low) / 2; 10 if (a[0] < a[mid]) { 11 high = mid - 1; 12 } 13 else { 14 low = mid + 1; 15 } 16 } 17 for (j = i - 1; j >= low; j--) { 18 a[j + 1] = a[j];//记录后移 19 } 20 a[low] = a[0];//插入正确位置 21 } 22 } 23 }
三、希尔排序(缩小增量排序)
1.时间复杂度:O(n1.5)
2.空间复杂度:O(1)
3.增量序列:应使增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1
4.实现:
1 void ShellInsert(int* a, int k, int num) { 2 int i, j; 3 for (i = k + 1; i < num; ++i) { 4 if (a[i] < a[i - k]) { 5 a[0] = a[i]; 6 for (j = i - k; (j && a[j] > a[0]); j -= k) { 7 a[j + k] = a[j];//记录后移 8 } 9 a[j + k] = a[0];//插入正确位置 10 } 11 } 12 } 13 14 void ShellSort(int* a, int num) { 15 int i, delta[4] = { 5, 3, 2, 1 };//增量序列 16 for (i = 0; i < 4; i++) { 17 ShellInsert(a, delta[i], num); 18 } 19 }
四、源代码
1 //在 Microsoft Visual Studio Community 2022 下通过测试 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <stdio.h> 4 5 void InsertSort(int* a, int num) { 6 int i, j; 7 for (i = 2; i < num; i++) { 8 if (a[i] < a[i - 1]) { 9 a[0] = a[i];//复制为哨兵 10 a[i] = a[i - 1]; 11 for (j = i - 2; a[j] > a[0]; j--) { 12 a[j + 1] = a[j];//记录后移 13 } 14 a[j + 1] = a[0];//插入到正确位置 15 } 16 } 17 } 18 19 void BinaryInsertSort(int* a, int num) { 20 int i, j, low, mid, high; 21 for (i = 2; i < num; i++) { 22 if (a[i] < a[i - 1]) { 23 a[0] = a[i]; 24 low = 1;//折半查找插入位置 25 high = i - 1; 26 while (high >= low) { 27 mid = (high + low) / 2; 28 if (a[0] < a[mid]) { 29 high = mid - 1; 30 } 31 else { 32 low = mid + 1; 33 } 34 } 35 for (j = i - 1; j >= low; j--) { 36 a[j + 1] = a[j];//记录后移 37 } 38 a[low] = a[0];//插入正确位置 39 } 40 } 41 } 42 43 void ShellInsert(int* a, int k, int num) { 44 int i, j; 45 for (i = k + 1; i < num; ++i) { 46 if (a[i] < a[i - k]) { 47 a[0] = a[i]; 48 for (j = i - k; (j && a[j] > a[0]); j -= k) { 49 a[j + k] = a[j];//记录后移 50 } 51 a[j + k] = a[0];//插入正确位置 52 } 53 } 54 } 55 56 void ShellSort(int* a, int num) { 57 int i, delta[4] = { 5, 3, 2, 1 };//增量序列 58 for (i = 0; i < 4; i++) { 59 ShellInsert(a, delta[i], num); 60 } 61 } 62 63 int main(void) { 64 int i; 65 int a[11] = { 0, 9, 4, 6, 2, 5, 7, 1, 3, 8, 0 };//a[0]设置监视哨 66 //InsertSort(a, 11); 67 //BinaryInsertSort(a, 11); 68 ShellSort(a, 11); 69 for (i = 1; i < 11; i++) { 70 printf("%d ", a[i]); 71 } 72 return 0; 73 }

浙公网安备 33010602011771号