void shellSort(int *arr,int Length){
int temp;
for(int gap=Length/2; gap>0;gap/=2){
for(int i=0;i<gap; i++){
for(int j=gap+i;j<Length;j+=gap){
temp=arr[j];
int k=j-gap;
while(k>=0&&arr[k]>temp){
arr[k+gap]=arr[k];
k-=gap;
}
arr[k+gap]=temp;
}
}
}
}
上面的希尔排序很简单:
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
![](https://images0.cnblogs.com/blog/751746/201507/171951233453903.png)
![](https://images0.cnblogs.com/blog/751746/201507/171951237203088.png)
for(int gap=Length/2; gap>0;gap/=2)
这是是设置不同的步长进行排序,每次步长除2.
for(int i=0;i<gap; i++)
这是对每组进行排序,如第一次分成两组,步长就是gap=10/2=5
则有了5组了。
![](https://images0.cnblogs.com/blog/751746/201507/171951243457730.jpg)
for(int j=gap+i;j<Length;j+=gap){
temp=arr[j];
int k=j-gap;
while(k>=0&&arr[k]>temp){
arr[k+gap]=arr[k];
k-=gap;
}
arr[k+gap]=temp;
}
组内进行插入排序。