跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
希尔排序
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
Admin
(
留言
|
贡献
)
2025年5月12日 (一) 00:18的版本
(Page creation by admin bot)
(差异) ←上一版本 |
已核准修订
(
差异
) |
最后版本
(
差异
) |
下一版本→
(
差异
)
警告:您正在编辑该页面的旧版本。
如果您发布该更改,该版本后的所有更改都会丢失。
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目介绍的是希尔排序(Shell Sort),一种基于插入排序的高效排序算法,适用于初学者和需要回顾该算法的程序员。}} == 概述 == '''希尔排序'''(Shell Sort)是[[插入排序]]的一种高效改进版本,由Donald Shell于1959年提出。它通过将原始列表分割成多个子序列进行插入排序,逐步缩小子序列的间隔,最终完成整体排序。希尔排序的时间复杂度优于普通的插入排序(<math>O(n^2)</math>),具体取决于间隔序列的选择。 === 核心思想 === 希尔排序的核心思想是: # 将待排序数组按一定间隔(称为“增量”或“gap”)分成若干子序列。 # 对每个子序列进行插入排序。 # 逐步缩小间隔,重复上述过程,直到间隔为1,此时整个数组基本有序,最后进行一次完整的插入排序。 == 算法步骤 == 希尔排序的步骤如下: # 选择一个增量序列 <math>gap_1, gap_2, \ldots, gap_k</math>,其中 <math>gap_1 > gap_2 > \ldots > gap_k = 1</math>。 # 对于每个增量 <math>gap_i</math>,将数组分成 <math>gap_i</math> 个子序列,每个子序列包含相隔 <math>gap_i</math> 的元素。 # 对每个子序列进行插入排序。 # 重复步骤2-3,直到增量为1,完成最后一次插入排序。 === 增量序列 === 常见的增量序列选择方式包括: * Shell原始序列:<math>gap = \lfloor n/2 \rfloor, \lfloor n/4 \rfloor, \ldots, 1</math>。 * Hibbard序列:<math>gap = 2^k - 1</math>(如1, 3, 7, 15, ...)。 * Knuth序列:<math>gap = (3^k - 1)/2</math>(如1, 4, 13, 40, ...)。 == 代码实现 == 以下是希尔排序的Python实现示例,使用Shell原始增量序列: <syntaxhighlight lang="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 # 缩小增量 # 示例输入与输出 arr = [12, 34, 54, 2, 3] shell_sort(arr) print("排序后的数组:", arr) </syntaxhighlight> {{Output| 排序后的数组: [2, 3, 12, 34, 54] }} === 代码解释 === 1. 初始增量 <code>gap</code> 设为数组长度的一半。 2. 对每个增量 <code>gap</code>,从 <code>gap</code> 开始遍历数组,对子序列进行插入排序。 3. 每次循环后,增量缩小为原来的一半,直到增量为1,完成最后一次排序。 == 时间复杂度分析 == 希尔排序的时间复杂度取决于增量序列的选择: * 最坏情况下(如使用Shell原始序列):<math>O(n^2)</math>。 * 最优情况下(如使用Hibbard或Knuth序列):<math>O(n^{3/2})</math> 或 <math>O(n \log^2 n)</math>。 == 实际应用案例 == 希尔排序在以下场景中表现优异: 1. '''中等规模数据排序''':当数据量不大(如几千到几万)时,希尔排序比 <math>O(n \log n)</math> 的算法(如快速排序)更高效,因为其常数因子较小。 2. '''嵌入式系统''':由于希尔排序是原地排序(不需要额外空间),适合内存受限的环境。 3. '''部分有序数据''':若数据已基本有序,希尔排序的插入排序步骤会非常高效。 == 示例图表 == 以下是一个希尔排序过程的示意图(使用Shell原始序列,初始gap=2): <mermaid> 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] </mermaid> == 与其他排序算法的比较 == * '''插入排序''':希尔排序是插入排序的改进版,通过分组减少了元素移动次数。 * '''快速排序''':希尔排序在中等规模数据中可能更快,但快速排序的平均时间复杂度更低(<math>O(n \log n)</math>)。 * '''归并排序''':归并排序需要额外空间,而希尔排序是原地排序。 == 总结 == 希尔排序是一种简单但高效的排序算法,特别适合中等规模数据或内存受限的场景。尽管其时间复杂度不如快速排序或归并排序,但在实际应用中仍有一席之地。理解希尔排序有助于掌握分组排序的思想,并为学习更复杂的算法打下基础。 {{Stub|algorithm}} [[Category:计算机科学]] [[Category:数据结构与算法]] [[Category:排序算法]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)