希尔排序的思想较为巧妙,它的思想:将要排序的文件分为n个组,距离为s的分为一组,再将这一组进行排序,完成这个操作之后,再将s的值变小继续排序直到距离为零时
- 下图进行第一次排序:首先要知道一个距离的值,这个值可以设为数组长度的一半(超过的话第一次排序不能将所有的数值都排序一次),在本案例中为4,初始值可以设为从下标为4的元素开始,这样正好可以使这个数组从下标为0的位置比较,元素都可以进行排序一遍
- 第一遍时,距离较大,每组所记录数较少,所以速度较快。后面的几次排序时,距离就会缩小,缩小的原则为除以2,在第二次排序时,明显每组的记录数就变多了,但是由于在第一遍排序的基础上,排序的速度并不会慢
- 在排序的过程中:还是以上图为例子,在下标为7的元素再进行排序时,他首先与下标为i=7-4的数比较,前者是小于后者的(在此为升序),所以要将这个较大的数放在这个数的下标加距离位置(也就是下标为7的位置),那么当前的这个元素还要继续比较,他与7-4这个位置再减4(即i-4=-1)的位置比较,结果这个位置不存在,那么本次的比较结束,且当前下标的值插入在i+4的位置
- 当距离为1时已经可以将所有的元素都排序一遍,且由于前面的排序使得后面的排序变得快速
代码如下:
shellSort(int arr[],int len,int n){
//len为arr的长度,n为希尔排序的分组间隔
int i,j,temp,k;
for(i=n;i>0;i>>=1){
for(j=i;j<len;j++){
temp = arr[j];
k = j-i;
while(k >= 0 && temp < arr[k]){
arr[k + i] = arr[k];
k-=i;
}
arr[k+i] = temp;
}
}
}