算法--排序--希尔

希尔是插入排序的姊妹,她在插入的基础上引入了分组的概念,在分组内做插入,然后不断地缩小分组的个数,分组为0即可完成排序。换句话,插入排序是分组为1的希尔排序。
举个例子:现有长度为10的数组[1, 5, 8, 4, 7, 3, 0, 2, 9, 6];

希尔排序
注:希尔排序的整个过程,图中颜色相同的表示处于同一个分组内,元素所处的位置对应着数组的下标。
(1)既然引入了分组gap,不妨就让gap = 10/2(当然这个长度你可以随便设,只是分组越小,小组内插入的效率就越高);也就是分成了5组,如图示。
(2)继续缩小gap,重复小组内的插入排序。gap = 5/2,分成2组,如图示。
(3)重复(2),gap = 2/2;此时相当于普通的插入排序,前面已经说过,插入排序在数据较少且基本有序的状态下,效率是最高的。而此时整体大部分数据处于有序状态,所以很高效。
(4)重复(2),gap = 0;完成排序。

条件:
数据量较小


原理:
(1)选出第一个gap,各个gap内插入;
(2)缩小gap,重复(1);
….
(n)gap为0,打完收工。


时间复杂度:

最优(n)和最差(n^2),平均nlog(n)。记住nlog(n)就行了。


笔面试出现的频率:

除了在线笔试偶尔会考到时间复杂度,面试和现场笔试从来没有考过。


实现:
为了方便记忆,这里写的尽量和插入排序类似,需要的话可以对比着来记。

public class SheSort {

    /**
     * <p>name: main</p>
     * <p>description: </p>
     * <p>return: void</p>
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] array = { 1, 5, 8, 4, 7, 3, 0, 2, 9, 6, 11, 13, 12, 141, 14, 15,
                17, 16, 18, 21, 20, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
                33, 34, 35, 36, 40, 39, 38, 37 };
        sheSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ", ");
        }
    }

    public static void sheSort(int[] array) {
        int gap = array.length / 5;
        while (gap > 0) {
            for (int i = gap; i < array.length; i += gap) {
                if (array[i] < array[i - gap]) {
                    int temp = array[i];
                    int j = i - gap;
                    while (j >= 0 && array[j] > temp) {
                        array[j + gap] = array[j];
                        j -= gap;
                    }
                    /** 容易出错 */
                    array[j + gap] = temp;
                }
            }
            gap = gap >> 1;
        }
    }
}
### 希尔排序算法详解 #### 算法概述 希尔排序(Shell Sort),亦称为递减增量排序算法,是对插入排序的一种优化版本[^1]。该算法由Donald Shell于1959年提出,并在论文“A high-speed sorting procedure”中对其进行了详细的阐述[^3]。 #### 工作原理 希尔排序通过比较相隔一定间隔的元素来工作,这些间隔逐渐减少直到变为1。当间隔为1时,希尔排序即成为普通的插入排序。这种策略使得远距离的数据可以更快地移动到接近其最终位置的地方,从而提高了整体性能[^4]。 #### 时间复杂度分析 尽管具体的渐近时间复杂度取决于所使用的间隔序列,但在最坏情况下,希尔排序的时间复杂度通常优于简单的插入排序。对于某些特定的选择间隔序列,平均情况下的表现甚至能够达到接近\( O(n \log n) \)。 #### 实现细节 以下是使用Python编写的希尔排序的具体实现: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 if __name__ == "__main__": test_array = [64, 34, 25, 12, 22, 11, 90] print("原始数组:", test_array) shell_sort(test_array) print("排序后的数组:", test_array) ``` 这段代码展示了如何利用逐步缩小的间隔来进行多次部分有序化的操作,最后完成整个列表的完全排序过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值