希尔排序(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成正比。

posted @ 2017-03-24 14:24  我是老邱  阅读(318)  评论(0编辑  收藏  举报