Java希尔排序

140 阅读1分钟

思路

希尔排序是插入排序的升级版,给定一个k的序列,比如1, 4, 13。那么先使用插入排序的思想,使数组每隔13个数有序,如:

  • a1, a14, a27...有序
  • a2, a15, a28...有序
  • ...

然后重新使用插入排序的思想,使数组每隔4个数有序,最后当k为1时,整个数组有序。

复杂度

  • 时间复杂度:取决于k的增量序列选取方式,n1.3, 最坏n2, 最好n*log2n
  • 空间复杂度:1

代码

/**
 * 希尔排序
 */
public class ShellSort {
    public static <T extends Comparable> void sort(T[] arr) {
        int n = arr.length;
        int k = 1;
        while (k < n / 3) k = 3 * n + 1; //1, 4, 13, 40...
        while (k >= 1){
            // 将数组变成k有序
            for (int i = k; i < n; i += k) {
                for (int j = i; j > 0 && arr[j].compareTo(arr[j - k]) < 0; j -= k) {
                    T temp = arr[j];
                    arr[j] = arr[j - k];
                    arr[j - k] = temp;
                }
            }
            k /= 3;
        }
    }
}

关于

一般情况下,希尔排序性能优于直接插入排序。但弱于快排。一般使用较少。