希尔排序
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;}}}}
上面的希尔排序很简单:
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。


for(int gap=Length/2; gap>0;gap/=2)
这是是设置不同的步长进行排序,每次步长除2.
for(int i=0;i<gap; i++)
这是对每组进行排序,如第一次分成两组,步长就是gap=10/2=5
则有了5组了。

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;}
组内进行插入排序。
浙公网安备 33010602011771号