希尔排序

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因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;
        }
    }
原文地址:https://www.cnblogs.com/wangjian920110/p/5526296.html