希尔排序逻辑

希尔排序是一种改进后的插入排序,

它涉及在不同的间隔之间进行子序列的插入排序,所以 希尔排序是不稳定排序

复杂度分析

平均时间复杂度:取决于具体的间隔序列

空间复杂度:O(1)

最差情况的时间复杂度是O(n^2),此时希尔排序退化为直接插入排序,即间隔为1。

最好的情况下可以达到O(n log n)

代码实现

class Main {
    public static void shellSort(int[] arr) {
        int len = arr.length;
        // 取间隔,从arr长度的一半开始,每次减少一半
        for(int mid = len / 2; mid>0 ; mid /= 2) {
            // 对每个小组内进行直接插入排序(视小组前面的数是有序的,依次插入合适的位置)
            for(int i = mid; i < len; i++) {
                int temp = arr[i];
                int j = i;
                while(j >= mid && arr[j - mid] > temp) {
                    arr[j] = arr[j - mid];
                    j -= mid;
                }
                arr[j] = temp;
            }
        }
        return;
    }
}

使用场景

希尔排序通常用于大规模数据集的排序,尤其是当数据集中的元素分布不均匀时,传统的插入排序的性能可能较差。通过逐步缩小间隔的方式,希尔排序能够较好地提高插入排序的性能。