shell 排序

shell排序算法思想

shell排序其实是插入排序的升级版,我们可以把数组分成h组,对每组 进行排序,然后不断的缩短h,当h缩短为1时就退化成了插入排序。

shell排序算法实现

 public static void main(String[] args) {
        int[] arr = {-2, 1, 33, 4, 5, 0, 0, -1, 45, 908, 3};
        int[] sortList = shellSort(arr);
        for (int i : sortList) {
            System.out.print(i + "  ");
        }

    }

    /**
     * shell  sort
     *
     * @param arr
     * @return
     */
    private static int[] shellSort(int[] arr) {
        if (arr.length == 0) return null;
        // 计算出步长
        int h = 1;
        int N = arr.length;
        while (h < N / 3) h = (h * 3 + 1);
        //控制步长
        while (h >= 1) {
            //插入排序
            for (int i = h; i < N; i++) {
                for (int j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
                    int temp = arr[j - h];
                    arr[j - h] = arr[j];
                    arr[j] = temp;
                }
            }
            h = h / 3;
        }
        return arr;
    }

算法复杂度

1.算法的最坏时间复杂度为O(n^2)
2.算法的最好时间复杂度为O(n)
3.算法的空间复杂度为O(n)

算法稳定性

1 shell排序是不稳定的

想看更多完整版请点击:shell排序

你可能感兴趣的:(shell 排序)