希尔排序是插入排序中的一个分支,但是较简单插入排序又有较大的改进,这使得它成为了历史上第一批突破二次时间屏障的排序算法之一哦。它是通过比较一定间隔的元素来工作的。因此希尔排序又称为缩小增量排序。
直接插入排序对于原始数据基本有序的情况下,效率较高。在此的基础上。我们可以想办法,使数据基本有序,然后利用直接插入排序的特长完成排序。
对于使数据基本有序的方法可以进行粗排,那又怎么进行粗排呢?希尔排序的方法是对于数据进行分组。然后再对于每个组的数据进行简单排序。但是值得注意的是:并不是把一个分组中的数据全部排序完毕,再排序第二个分组的,而是首先将所有分组的第一个元素排完,再对所有的分组的第二个元素排序,依次类推。
其实一次粗排肯定不能完成排序,那就要不断的减小分组间隔再进行粗排。这样循环,直到分组间隔减小到1时,最后进行一次直接插入排序就可以完成排序了。
算法描述:1>选择一个物理位置的间隔(gap)的序列(实现中常将gap递减) 2>按间隔序列个数K,对序列进行K次排序 3>每次排序,根据对应的间隔gap,将待排序列分成若干个组,分别对各组进行插入排序。当最终间隔gap为1,时,排序完毕。
下面是用C语言实现的希尔排序:
#include <stdio.h>
void Print (int a[],int n){
int i;
for(i=0;i<n;i++){
printf("%d\t",a[i]);
}
printf("\n");
}
void S