目录

希尔排序( Shell Sort )的实现

希尔排序的排序逻辑

希尔排序在插入排序的基础上有了增量序列(increment sequence)的概念。

最优的增量序列是希尔排序性能的关键。

在增量 3x + 1 的情况下,最坏情况下比较次数为 $O(N^\frac{3}{2})$ 。

Java实现希尔排序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ShellSort {

    public static void sort(Comparable[] a) {
        int N = a.length;
        int h = 1;
        for (; h < N / 3; ) {
            h = 3 * h + 1;
        }
        for (; h >= 1; ) {
            for (int i = h; i < N; i++) {
                for (int j = i; j - h >= 0; j -= h) {
                    if (less(a[j], a[j - h])) {
                        swap(a, j, j - h);
                    } else {
                        break;
                    }
                }
            }
            h = h / 3;
        }
    }

    public static void main(String[] args) {
        Integer[] a = {6, 5, 7, 8, 10, 1, 100, 23, 76, 19, 11, 22, 18, 90, 21, 87, 78, 91, 68, 56, 57, 53, 38};
        sort(a);
        for (Integer integer : a) {
            StdOut.print(integer + " ");
        }
    }
    
}

有一点需要注意的就是,在判断前一个值小于当前值时,没必要再循环下去了,退出当前循环。

以上,希尔排序,完毕。