reference: https://www.cnblogs.com/chengxiao/p/6104371.html
插入排序,是穩定的。
希爾排序,是不穩定的。
一次插入排序是穩定的,不會改變相同元素的相對順序。希爾排序需要多次插入排序,值相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。
希爾排序,又稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本:增量gap,使元素的移動是跳躍式的,較少了元素移動的次數。
1 #include <stdio.h>
2
3 void insertSort(int a[], int len);
4 void shellSort(int a[], int len);
5 void display(int a[], int len);
6
7 int main(int argc, char *argv)
8 {
9 int a[] = {2,6,7,2,5,9,0};
10 int len = sizeof(a)/sizeof(a[0]);
11
12 //insertSort(a, len); // 插入排序
13 shellSort(a, len); // 希爾排序
14
15 display(a, len);
16 return 0;
17 }
18
19 // 插入排序:當前值與其前面的值比較,大於當前值的部分整體後移,
20 // 再將當前值插入正確的位置
21 void insertSort(int a[], int len)
22 {
23 int i;
24 for(i=1; i<len; i++)
25 {
26 int j = i;
27 int temp = a[i];
28 while(j-1>=0 && temp<a[j-1])
29 {
30 a[j] = a[j-1];
31 j--;
32 }
33 a[j] = temp;
34 }
35 }
36
37 // 希爾排序、縮小增量排序
38 // 按下標的設定增量gap來分組,對每組使用insertSort
39 // 代碼實現時可以不用按組處理,可以逐個跨組處理
40 void shellSort(int a[], int len)
41 {
42 int gap;
43 for(gap=len/2; gap>=1; gap=gap/2)
44 {
45 int i;
46 for(i=gap; i<len; i++)
47 {
48 int j = i;
49 int temp = a[i];
50 while(j-gap>=0 && temp<a[j-gap])
51 {
52 a[j] = a[j-gap];
53 j = j-gap;
54 }
55 a[j] = temp;
56 }
57 }
58 }
59
60 void display(int a[], int len)
61 {
62 int i;
63 for(i=0; i<len; i++)
64 printf("%d ", a[i]);
65 printf("\n");
66 }