news 2026/4/15 14:42:55

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,其核心思想是通过引入“增量”来改进直接插入排序在处理大规模无序数据时效率低下的问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,其核心思想是通过引入“增量”来改进直接插入排序在处理大规模无序数据时效率低下的问题

希尔排序(Shell Sort)是一种基于插入排序的高效排序算法,其核心思想是通过引入“增量”来改进直接插入排序在处理大规模无序数据时效率低下的问题。它由Donald Shell于1959年提出,因此得名。

基本概念与原理:

  • 别名:缩小增量排序。
  • 核心思想
    1. 将待排序序列按照某个“增量”k分为若干个子序列,每个子序列由相隔k个位置的元素组成;
    2. 对每个子序列进行直接插入排序
    3. 随着排序的进行,逐步减小增量k(如每次折半),重复上述分组和排序;
    4. 当增量减至1时,对整个序列进行最后一次直接插入排序,此时序列已基本有序,因此效率较高。

该方法的优势在于:早期的大步长移动使得远距离元素能快速接近目标位置,显著减少总的比较和移动次数。


示例过程详解(增量序列:5, 3, 1)

原始数组:[48, 37, 64, 96, 75, 12, 26, 48, 54, 03]

  • 第一趟(增量 = 5)

    • 分组:(48,12), (37,26), (64,48), (96,54), (75,03)
    • 各组内排序后得到:[12, 26, 48, 54, 03, 48, 37, 64, 96, 75]
  • 第二趟(增量 = 3)

    • 分组:(12,54,37,75), (26,48,64), (48,96)
    • 插入排序各组后结果为:[12, 03, 48, 37, 26, 48, 54, 64, 96, 75]
  • 第三趟(增量 = 1)

    • 整体做一次直接插入排序
    • 最终结果:[03, 12, 26, 37, 48, 48, 54, 64, 75, 96]

特点总结:

  • 时间复杂度
    • 依赖于所选的增量序列。
    • 使用原始希尔增量(n/2, n/4, …, 1)时,最坏情况为 O(n²),平均约为 O(n^1.3)。
    • 若使用更优增量序列(如Hibbard、Sedgewick等),可提升到接近 O(n log n)。
  • 空间复杂度:O(1),仅需常数额外空间用于交换。
  • 稳定性不稳定,因为在不同增量下的插入排序可能导致相同元素相对位置改变。

代码实现参考(完整版):

defshell_sort(arr):n=len(arr)gap=n//2# 初始增量whilegap>0:foriinrange(gap,n):temp=arr[i]j=i# 在同一增量组内进行插入排序whilej>=gapandarr[j-gap]>temp:arr[j]=arr[j-gap]j-=gap arr[j]=temp gap//=2# 缩小增量# 示例使用data=[48,37,64,96,75,12,26,48,54,3]shell_sort(data)print(data)# 输出: [3, 12, 26, 37, 48, 48, 54, 64, 75, 96]

希尔排序的性能在很大程度上依赖于所采用的增量序列(gap sequence)。不同的增量序列会显著影响算法的时间复杂度和实际运行效率。以下是几种常见的增量序列及其对性能的影响:


1.原始希尔增量(Shell’s Original Sequence)

  • 公式:$ \text{gap} = \left\lfloor \frac{n}{2} \right\rfloor, \left\lfloor \frac{n}{4} \right\rfloor, \dots, 1 $
  • 即每次将增量折半:n//2, n//4, ..., 1
  • 时间复杂度
    • 最坏情况:$ O(n^2) $
    • 平均情况:约 $ O(n^{1.5}) $
  • 特点
    • 简单易实现,是最早提出的增量方式。
    • 但由于相邻增量可能有公因数,导致部分元素分组重复,无法充分预排序。

2.Hibbard 增量序列(Hibbard’s Sequence)

  • 公式:$ 2^k - 1 $,即1, 3, 7, 15, 31, ...
  • 取小于 n 的最大值开始递减
  • 时间复杂度:最坏 $ O(n^{3/2}) $
  • 优点
    • 每个增量与下一个无公因数,能更好地打乱数据分布;
    • 分组更均匀,有助于提高排序效率。

3.Sedgewick 增量序列(Sedgewick’s Sequence)

  • 形式较复杂,典型构造为:
    • $ \text{gap}_i =
      \begin{cases}
      9 \times 2^i - 9 \times 2^{i/2} + 1 & \text{if } i \text{ even} \
      8 \times 2^i - 6 \times 2^{(i+1)/2} + 1 & \text{if } i \text{ odd}
      \end{cases} $
    • 实际常用前几项:1, 5, 19, 41, 109, ...
  • 时间复杂度:最坏可达 $ O(n^{4/3}) $,平均接近 $ O(n \log n) $
  • 优点:目前实践中表现最好的之一,适合大规模数据。

4.Knuth 增量序列(Knuth’s Sequence)

  • 公式:$ \frac{3^k - 1}{2} $,即1, 4, 13, 40, 121, ...
  • 时间复杂度:最坏 $ O(n^{3/2}) $
  • 优点
    • 增长适中,避免过快收敛到1;
    • 在小到中等规模数据上表现稳定。

不同增量序列的性能对比(大致)

增量序列最坏时间复杂度平均性能实现难度推荐程度
原始希尔$ O(n^2) $一般简单⭐⭐☆☆☆
Hibbard$ O(n^{3/2}) $较好中等⭐⭐⭐☆☆
Knuth$ O(n^{3/2}) $稳定中等⭐⭐⭐⭐☆
Sedgewick$ O(n^{4/3}) $优秀较难⭐⭐⭐⭐⭐

总结:

选择合适的增量序列可以大幅提升希尔排序的效率。虽然所有版本都是基于“缩小增量”的思想,但好的增量序列能够:

  • 减少比较和移动次数;
  • 提高子序列的有序性;
  • 加速最终插入排序阶段的完成。

推荐实践:对于一般用途,使用Knuth 序列Sedgewick 序列能获得更优性能;教学或简单场景可用原始希尔增量。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 6:51:04

C# 交错数组初始化完全解析(从基础到高性能实践)

第一章:C# 交错数组初始化概述 什么是交错数组 交错数组(Jagged Array)是C#中一种特殊的多维数组结构,它表示“数组的数组”。与矩形多维数组不同,交错数组的每一行可以拥有不同的长度,提供了更高的灵活性…

作者头像 李华
网站建设 2026/4/7 9:42:20

揭秘C# Span底层原理:如何实现零分配高效数据处理

第一章&#xff1a;揭秘C# Span底层原理&#xff1a;如何实现零分配高效数据处理Span的本质与设计目标 Span<T> 是 C# 中一种高性能的栈上数据结构&#xff0c;专为高效访问连续内存区域而设计。其核心优势在于避免堆内存分配&#xff0c;同时提供统一接口来操作数组、原…

作者头像 李华
网站建设 2026/4/7 13:52:55

律师事务所知识管理:历史案件卷宗扫描归档OCR解决方案

律师事务所知识管理&#xff1a;历史案件卷宗扫描归档OCR解决方案 在一家中型律所的档案室里&#xff0c;律师小李翻找一份三年前的合同纠纷案卷时&#xff0c;花了整整两个小时——从编号模糊的纸质文件柜中抽出一摞又一摞泛黄的卷宗&#xff0c;最终才在角落里找到那份关键证…

作者头像 李华
网站建设 2026/3/24 11:23:15

医疗图像CutMix增强稳住病灶检测

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 医疗图像CutMix增强&#xff1a;提升病灶检测鲁棒性的创新策略目录医疗图像CutMix增强&#xff1a;提升病灶检测鲁棒性的创新策略 引言&#xff1a;数据稀缺时代的检测困境 一、问题根源&#xff1a;医疗图像数据增强的三…

作者头像 李华
网站建设 2026/4/15 12:19:11

【论文阅读】--从OSDI里学习论文的引言

如何写好系统论文的引言&#xff1a;从 OSDI/NSDI 案例学习到的通用模板 本文整理自多篇 OSDI/NSDI 的容错/分布式系统论文&#xff0c;总结它们在引言布局上的共性&#xff0c;由AI辅助生成。 1. 高质量系统论文引言的共同套路 从这些论文中&#xff0c;可以抽象出一个非常…

作者头像 李华
网站建设 2026/4/14 23:15:49

招聘网站内容抓取:职位描述图片转文本用于搜索引擎索引

招聘网站内容抓取&#xff1a;职位描述图片转文本用于搜索引擎索引 在如今的招聘平台上&#xff0c;每天都有成千上万的新职位上线。求职者打开搜索框输入“Java 远程 工资20k”&#xff0c;期望看到精准匹配的结果——但如果你发现不少岗位明明符合条件&#xff0c;却怎么也搜…

作者头像 李华