插入类排序

一、直接插入排序(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 }
源代码

 

posted @ 2022-02-10 20:32  吕辉  阅读(52)  评论(0)    收藏  举报