[排序算法] 4. 希尔排序(插入排序)
发布日期:2021-05-12 23:16:45 浏览次数:12 分类:精选文章

本文共 993 字,大约阅读时间需要 3 分钟。

希尔排序(Hill Sorting)


基本思想

希尔排序(Shellsort)是一种外推排序算法,基于想象一下,越有序的数组对插入的影响越小。其基本思路是逐步增加“增量”,使得数组逐渐变得有序,从而优化插入排序的效率。

  • 选择增量:首先设置一个小于数组大小的整数d1。然后,根据d1将数组分成多个组,每个组中的元素距离d1的倍数。

  • 内部排序:对每个组进行直接插入排序,形成一个有序的子列表。

  • 递减增量:重复上述过程,选择下一个增量d2 < d1,直到增量变为1,此时数组已经基本排序,可以直接插入排序完成。


  • 代码实现

    以下是一个基于递增增量的希尔排序实现示例:

    void ShellSort(int array[], int size) {    int gap = size;    while (1) {        gap = (gap / 3) + 1;        for (int i = gap; i < size; i++) {            int k = array[i];            int j;            for (j = i - gap; j >= 0; j -= gap) {                if (array[j] <= k)                    break;                array[j + gap] = array[j];            }            array[j + gap] = k;        }        if (gap == 1)            break;    }}

    测试数据示例

    int array[] = { 3, 9, 1, 4, 2, 8, 2, 7, 5, 3, 6, 11, 9, 4, 2, 5, 0, 6 };

    性能分析

    时间复杂度

    • 最坏情况:O(n²),需要故意构造特殊数组。
    • 平均情况:O(n¹.3),在平均情况下表现较好。
    • 最好情况:O(n),已排序数组时完成。

    空间复杂度

    • O(1),算法在内存中仅使用常数额外空间。

    稳定性

    • 不稳定排序,相邻元素交换可能导致问题。

    通过连续递减增量分组内排序的方式,希尔排序能够有效地提高插入排序的效率,特别适用于低内存需求和插入排序率的心理上限优化问题。

    上一篇:[排序算法] 5. 冒泡排序(交换排序)
    下一篇:[排序算法] 3. 二分插入排序(插入排序、二分查找)

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月06日 15时30分36秒