希尔排序
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
希尔排序是一种特殊的插入排序 , 在插入排序的算法上引入分组的概念
代码兑现
class shellOrder:order { private int[] a = null; private int gap,local,temp; //每间隔gap个元素分成一组 public shellOrder(int[] a) { this.a = a; gap = a.Length; } public int[] orderBy() { do { gap = gap / 3+1;//2345 都可以 gap=1 就相当于插入排序 ,/3 平均收敛效果最佳,改变分组条件 for (int i = gap; i < a.Length;i+=gap ) //n组同时进行插入排序 local=i; temp=a[local]; for (int j = i - gap; (j >=0) && (a[j] > temp);j-=gap ) //注意这里 ,希尔排序 每组的插入排序是同时进行的,不是一组插入完成,在进行另一组!!! { a[j + gap] = a[j]; local = j; } a[local] = temp; //插入操作 } } while (gap>1); return a; } }