澳门至尊网站-首页

您的位置:澳门至尊网站 > 技术教程 > Hill排序

Hill排序

2019-10-20 05:24

澳门至尊网站,援用:对于广泛乱序数组插入排序非常的慢,因为它只会换来相邻的要素,因而成分只好一点一点的从数组的后生可畏端移动到另热火朝天端。例如,借使主键最小的要素正幸好数组的限度,要将它挪到科学的地方就需求N-1次活动。Hill排序为了加速捷度轻便的精雕细琢了插入排序,交流不相邻的因素以对数组的片段进展排序,并最后用插入排序将龙腾虎跃部分有序的数组排序。

对峙于最简便的取舍排序,插入排序在减轻全部某个规律的乱序数组排序时会更有优势,但鉴于插入排序只会换来相邻的元素,由此成分只好一点一点的从意气风发端移到另风度翩翩端。
Shell排序轻巧的精雕细刻了插入排序,交流不相邻的要素以对数组的有些进展排序,并最后用插入排序对一些有序的数组排序。

            int[] sort = new int[13] { 1, 4, 89, 34, 56, 40, 59, 60, 39, 1, 40, 90, 48 };  // 输入一个数组
            int h = 1;
            int length = sort.Length;
            while (h > length / 3)
            {
                h = 3 * h + 1;      // 1,4,13,40,121,364,1093,...
            }   // h的初始值根据数组元素多少而定
            while (h >= 1)  // 当h=1 时排序完成
            {
                for (int i = h; i < length; i++)  // 将间隔为h的元素排序
                {
                    for (int j = i; j >= h && sort[j] < sort[j - h]; j -= h) // 当满足这两个条件时交换 数值
                    {
                        int temp = sort[j];
                        sort[j] = sort[j - h];
                        sort[j - h] = temp;
                    }
                }
                h = h / 3;
            }
            for (int i = 0; i < sort.Length; i++)  // 输出
               {
                    Console.Write(sort[i] + " ");
               }
public class Shell{
    public static void sort(Comparable[] a){
        int N = a.length;
        int h = 1;
        while(h<N/3) h = 3*N+1;
        while(h>=1){
            for(int i=h; i<N; i++){
                for(int j=i; j>=h && less(a[j],a[j-h]); j-=h){
                    exch(a,j,j-h);
                }
            }
        h = h/3;
        }
    }
}

  备注:文字和代码有参照到图书:算法 第四版(人民邮政和邮电通讯出版社) Hill排序 (162-163)

上边的代码应用的h体系为53%(3^k-1)。
Hill排序的思索是使数组中任性间隔为h的因素都以百折不挠的。那样的数组被称为h有序数组。要是h比相当的大,大家就能够将成分移动到相当远的地方,为兑现越来越小的h有序数组创设便利。
落到实处Hill排序的意气风发种办法是对此各类h,用插入排序将h个子数组独立的排序。但因为子数组是单身的,更简便易行的点子是在h子数组大校各个成分调换来比他大的成分早前去,只需将插入排序的移位成分的偏离由1改为h就能够。

本文由澳门至尊网站发布于技术教程,转载请注明出处:Hill排序

关键词:

  • 上一篇:没有了
  • 下一篇:没有了