希尔排序

  1. void shellSort(int *arr,int Length){
  2. int temp;
  3. for(int gap=Length/2; gap>0;gap/=2){
  4. for(int i=0;i<gap; i++){
  5. for(int j=gap+i;j<Length;j+=gap){
  6. temp=arr[j];
  7. int k=j-gap;
  8. while(k>=0&&arr[k]>temp){
  9. arr[k+gap]=arr[k];
  10. k-=gap;
  11. }
  12. arr[k+gap]=temp;
  13. }
  14. }
  15. }
  16. }
上面的希尔排序很简单:
    该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
   

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

  1. for(int j=gap+i;j<Length;j+=gap){
  2. temp=arr[j];
  3. int k=j-gap;
  4. while(k>=0&&arr[k]>temp){
  5. arr[k+gap]=arr[k];
  6. k-=gap;
  7. }
  8. arr[k+gap]=temp;
  9. }
组内进行插入排序。




















原文地址:https://www.cnblogs.com/yml435/p/4655556.html