快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3224 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

34|希尔排序:通过部分有序逼近全局有序

你好,我是王健伟。
上一节我们讲解了直接插入排序算法。回顾前面学习的直接插入排序,不难想到下面两个问题。
首先,在待排序的数组中,元素本身就是有序的情况下,就不需要移动任何元素,所以直接插入排序最好情况时间复杂度为 O(n)。不难想象,如果数组中元素多数都是有序(基本有序)的情况下,那么需要移动的元素数量就会大大减少。
这里所谈到的基本有序,可以理解成小的关键字大部分在前面,大的关键字大部分在后面,比如如下数组中的元素{1,2,10,16,18,45,23,99,42,67}和{16,1,45,23,99,2,18,67,42,10}数组中元素相比,前者算得上是基本有序了。
其次,如果数组中元素数量较少,那么直接插入排序的效率也会很高。
基于上述两点对直接插入排序算法进行改进,就可以得到希尔排序算法。

希尔排序(Shell Sort)基本概念

希尔排序这个名字来源于它的发明者希尔(Donald Shell),这类排序也被称作“缩小增量排序(Diminishing Increment Sort)”,是直接插入排序的一种更高效率的改进版。
希尔排序算法的思想是先追求元素的部分有序,然后再逐渐逼近全局有序。具体的做法是先将整个待排序记录序列(或称为数组元素)分割成若干个子序列,分别进行直接插入排序,等到整个序列中的记录基本有序时,再对所有记录进行一次直接插入排序。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

希尔排序是一种高效的排序算法,通过将待排序记录序列分割成若干个子序列,分别进行直接插入排序,然后逐渐缩小增量,最终对整个序列进行直接插入排序。该算法追求部分有序,然后逐渐逼近全局有序,从而提高了排序的效率。希尔排序的实现代码并不复杂,但选择合适的增量序列对排序效果至关重要。文章通过示例数组的排序过程详细介绍了希尔排序的执行步骤,以及增量值不同时的排序效果。希尔排序的时间复杂度与增量序列的选择有关,不同的增量序列可能会影响排序效果。文章还提到希尔排序的空间复杂度为O(1),并指出了希尔排序的不稳定性。总的来说,希尔排序是对直接插入排序的改进,速度更快,但实现代码更加复杂,增量序列的选择和稳定性需要特别注意。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部