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 }