zoukankan      html  css  js  c++  java
  • 希尔排序(Shell Sort)

    一、思路

    希尔排序是基于插入排序算法,通过允许不相邻的元素进行交换这一简单的改进,使数组变为局部有序,最终再用插入排序。

    希尔排序的思想是使数组中任意间隔h的元素都是有序的。这样的数组被称为h有序数组。也就是说h有序数组h个互相独立有序数组交叉编织在一起的一个数组。

    如果h很大,算法能将元素移动到很远的地方,为实现更小的h创造方便。用这种方式,对任意以1结尾的h序列,都能讲数组排序,这就是ShellSort

    二、代码实现

    采用1/2(3k-1)序列,h从第一个大于或者等于floor(N/3)开始,递减到1。

    序列为:1,4,13,40,121,364,1093,……。

    比如N=16时,h从13开始,一直递减到1,即13,4,1。

    public static void sort(Comparable[] a) {
            
            int N = a.length;
            
            //find first h(1,4,13,40,121,……) is larger than or equals N/3
            int h = 1;
            while(h < N/3) {
                h = 3 * h + 1;
            }
            
            //h-sorting(insert-sort) until h = 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);
                    }
                    show(a);
                }
                h = h/3;
            }
            
        }

    三、性能分析

    目前最重要的结论是达不到平方级别。

    最坏的情况下,上述代码的比较次数和N3/2成正比。

  • 相关阅读:
    Maven的生命周期
    Maven坐标
    IDEA配置maven
    IDEA配置tomcat
    重写父类方法
    类的继承
    内部类
    static关键字
    线程相关知识
    数组
  • 原文地址:https://www.cnblogs.com/songdechiu/p/6611340.html
Copyright © 2011-2022 走看看