希尔排序
希尔排序就是将给定数组分成多个部分,进行插入排序。每次分组步长gap为n/2,即是每隔gap的数都是一组的。简单的说如果一个数组长度为10{0,1,2,3,4,5,6,7,8,9},gap为2时,那么0,2,4,6,8,为一组,1,3,5,7,9为一组。然后分别对这两组进行插入排序。gap一般定为n/2,以此循环下去,n/2/2,每次步长为上一次的一半,直到gap==1时,那么在n==1完成后,最终排序也就完成了。
希尔排序图
如上图数组颜色一样的为一组,然后对这一组,进行插入排序。初始数据为 5,4,6,8,7,3,0,1 第一步gap==8/2。
分组情况为{5,7} {4,3} { 6,0} { 8,1}分别对这四组插入排序 { 5,7} {3,4} {0,6} {1,8}
最后数据为{5,3,0,1,7,4,6,8}
gap==2时分组情况为{5,0,7,6} {3,1,4,8} 分别插入排序结果是{0,5,6,7} {1,3,4,8}最后数据结果是{0,1,5,3,6,4,7,8}
如此循环直到n==1完成排序。
代码实现:
void shellsort1(int a[], int n) { int i, j, gap; /** * 步长,划分组的 */ for (gap = n / 2; gap > 0; gap /= 2) { /** * 划分成组 */ for (i = 0; i < gap; i++) { /** * 每组直接插入算法 */ for (j = i + gap; j < n; j += gap) { if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } } } }
时间: 2024-10-12 10:31:54