跳转到内容

希尔排序

来自代码酷
Admin留言 | 贡献2025年5月12日 (一) 00:18的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

模板:Note

概述

希尔排序(Shell Sort)是插入排序的一种高效改进版本,由Donald Shell于1959年提出。它通过将原始列表分割成多个子序列进行插入排序,逐步缩小子序列的间隔,最终完成整体排序。希尔排序的时间复杂度优于普通的插入排序(O(n2)),具体取决于间隔序列的选择。

核心思想

希尔排序的核心思想是:

  1. 将待排序数组按一定间隔(称为“增量”或“gap”)分成若干子序列。
  2. 对每个子序列进行插入排序。
  3. 逐步缩小间隔,重复上述过程,直到间隔为1,此时整个数组基本有序,最后进行一次完整的插入排序。

算法步骤

希尔排序的步骤如下:

  1. 选择一个增量序列 gap1,gap2,,gapk,其中 gap1>gap2>>gapk=1
  2. 对于每个增量 gapi,将数组分成 gapi 个子序列,每个子序列包含相隔 gapi 的元素。
  3. 对每个子序列进行插入排序。
  4. 重复步骤2-3,直到增量为1,完成最后一次插入排序。

增量序列

常见的增量序列选择方式包括:

  • Shell原始序列:gap=n/2,n/4,,1
  • Hibbard序列:gap=2k1(如1, 3, 7, 15, ...)。
  • Knuth序列:gap=(3k1)/2(如1, 4, 13, 40, ...)。

代码实现

以下是希尔排序的Python实现示例,使用Shell原始增量序列:

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  # 缩小增量

# 示例输入与输出
arr = [12, 34, 54, 2, 3]
shell_sort(arr)
print("排序后的数组:", arr)

模板:Output

代码解释

1. 初始增量 gap 设为数组长度的一半。 2. 对每个增量 gap,从 gap 开始遍历数组,对子序列进行插入排序。 3. 每次循环后,增量缩小为原来的一半,直到增量为1,完成最后一次排序。

时间复杂度分析

希尔排序的时间复杂度取决于增量序列的选择:

  • 最坏情况下(如使用Shell原始序列):O(n2)
  • 最优情况下(如使用Hibbard或Knuth序列):O(n3/2)O(nlog2n)

实际应用案例

希尔排序在以下场景中表现优异: 1. 中等规模数据排序:当数据量不大(如几千到几万)时,希尔排序比 O(nlogn) 的算法(如快速排序)更高效,因为其常数因子较小。 2. 嵌入式系统:由于希尔排序是原地排序(不需要额外空间),适合内存受限的环境。 3. 部分有序数据:若数据已基本有序,希尔排序的插入排序步骤会非常高效。

示例图表

以下是一个希尔排序过程的示意图(使用Shell原始序列,初始gap=2):

graph TD A[原始数组: 12, 34, 54, 2, 3] --> B[gap=2: 子序列1=12,54,3; 子序列2=34,2] B --> C[子序列1排序后: 3,12,54] B --> D[子序列2排序后: 2,34] C --> E[合并后数组: 3, 2, 12, 34, 54] D --> E E --> F[gap=1: 最终插入排序] F --> G[排序完成: 2, 3, 12, 34, 54]

与其他排序算法的比较

  • 插入排序:希尔排序是插入排序的改进版,通过分组减少了元素移动次数。
  • 快速排序:希尔排序在中等规模数据中可能更快,但快速排序的平均时间复杂度更低(O(nlogn))。
  • 归并排序:归并排序需要额外空间,而希尔排序是原地排序。

总结

希尔排序是一种简单但高效的排序算法,特别适合中等规模数据或内存受限的场景。尽管其时间复杂度不如快速排序或归并排序,但在实际应用中仍有一席之地。理解希尔排序有助于掌握分组排序的思想,并为学习更复杂的算法打下基础。

模板:Stub