希尔排序
1 - 1959 年 Shell 发明的第一个突破 O(n2) 的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于它会优先比较距离较远的元素
2 - 希尔排序又叫缩小增量排序,它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止
① 第一趟,gap = length/2 = 4
② 第二趟,增量缩小为 2
③ 第三趟,增量缩小为 1,得到最终排序结果
3 - 代码示例
1 // 数组 2 int array[] = {12,91,21,10,13}; 3 int length = sizeof(array)/sizeof(array[0]);// 5 个元素 4 5 6 // 最外层控制增量,循环缩小 7 for (int gap = length/2; gap > 0; gap = gap/2) { 8 9 // 中间控制需要遍历的趟数:趟数 + gap = length 10 // 如 gap = 1,需遍历 4 趟; gap = 2;需要遍历 3 趟....... 11 for (int i = gap; i < length; i++) { 12 13 14 printf("----- gap = %d 第 %d 趟 ------\n\n",gap,i-gap +1); 15 int j = i; 16 int current = array[i]; 17 18 while (j - gap >= 0 && current < array[j - gap]) { 19 array[j] = array[j - gap]; 20 j = j - gap; 21 } 22 array[j] = current; 23 24 int n = 0; 25 while (n < length) { 26 printf("%d\t",array[n]); 27 n++; 28 } 29 printf("\n\n"); 30 } 31 32 }
日志打印