1 //直接快插法,最好情况每次插入数据就在最后时间复杂度为O(n),最坏情况为每次插入数据为最小,
2 //每次移动最大次数及时间复杂度为O(n2)
3 void InsertSort(int array[], int n)
4 {
5 int i, j;
6 for (i = 1; i < n; ++i)//从第二个数据开始,默认第一个数据已经有序
7 {
8 int tenp = array[i];//将要插入数据先寄存
9 j = i;
10 while (j >0 && tenp < array[j-1])
11 {
12 array[j] = array[j-1];//数据后移
13 --j;
14 }
15 array[j] = tenp;//插入到正确位置
16 }
17 }
18
19 //插入排序升级版希尔排序
20 void ShellSort(int array[], int n)
21 {
22 /*//大话数据结构示例
23 int i, j, temp;
24 int increment = n;
25 do {
26 increment = increment / 3 + 1;
27 for (i = increment + 1; i <= n; ++i)
28 {
29 if (array[i] < array[i - increment])
30 {
31 temp = array[i];
32 j = i - increment;
33 while(j > 0 && array[j] > temp)
34 {
35 array[j + increment] = array[j];
36 j -= increment;
37 }
38 array[j + increment] = temp;
39 }
40 }
41 } while (increment > 1);*/
42
43 int i, j;
44 int step = n;
45 for (step = step / 2; step > 0; step = step / 2) //这里的step步长是根据元素个数这种情况定义的
46 {
47 for (i = step; i < n; ++i)
48 {
49 if (array[i] < array[i - step])
50 {
51 int temp = array[i]; //把数组下标i的值放到temp中
52 j = i;
53 while (j >= step && array[j - step] > temp)
54 {
55 array[j] = array[j - step]; //把大的值往后插入
56 j -= step;
57 }
58 array[j] = temp; //把小的值往前插入
59 }
60 }
61 }
62 }
63 //希尔排序的时间复杂取决于增量序列,但是它已经突破了为O(n2);