什么是希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

算法步骤:
① 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
② 按增量序列个数 k,对序列进行 k 趟排序;
③ 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。


希尔排序过程

希尔排序的基本思想是∶将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。

例如,假设有这样一组数

[13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10]

如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样(坚着的元素是步长组成):

13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序:

10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

将上述四行数字,依序接在一起时我们得到:

[10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45]

这时10已经移至正确位置了,然后再以3为步长进行排序:

10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为∶

10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序(此时就是简单的插入排序了)


希尔排序的演示


时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n^2)
  • 稳定想:不稳定

代码实现

def shell_sort(alist):'''希尔排序'''n = len(alist)gap = n//2#gap变化到0之前,插入算法执行的次数#插入算法,与普通的插入算法的区别就是gap步长while gap > 0:for  j in range(gap,n):i = jwhile i > 0:if alist[i] < alist[i-gap]:alist[i],alist[i-gap] = alist[i-gap],alist[i]i -= gapelse:break#缩短gap步长gap//=2if __name__ == '__main__':li = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10]print(li)shell_sort(li)print(li)

结果:

[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]
[10, 13, 14, 23, 25, 25, 27, 33, 39, 45, 59, 65, 73, 82, 94, 94]

数据结构与算法笔记(九)—— 希尔排序相关推荐

  1. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  2. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  3. JS数据结构与算法 笔记

    JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...

  4. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  5. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  6. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  7. 数据结构:从插入排序到希尔排序

    数据结构:从插入排序到希尔排序 插入排序 算法思路 每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程. n个待排序的元素由一个有序表和一个无序表组成,开 ...

  8. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  9. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  10. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

最新文章

  1. jQuery获取带点的id元素
  2. ICCV 2019:谷歌获最佳论文!中国入选论文最多,中科院、清华领跑
  3. Python、Lua和Ruby比较——脚本语言大P.K.
  4. web页面--前端明水印
  5. Feature Pyramid Networks for Object Detection 论文笔记
  6. linux一路填坑...
  7. vue-resource使用
  8. presto领读 查询引擎翻译
  9. oracle查询语句大全(oracle 基本命令大全一)
  10. 你需要知道的那些 redis 数据结构(前篇)
  11. php阅读器开发,微信小程序阅读器的简单实例开发
  12. java创建子类对象的步骤_一通Spring骚操作:我敢说没人比我更懂Java对象创建
  13. php里的header,PHP中常用的header头部定义有哪些
  14. CINNO:2025年全球折叠屏智能手机销量有望超5700万部
  15. 石头高墙怎么放_朱良志:古人对石头的审美
  16. linux操作实例,linux下的一些文档操作实例 | Soo Smart!
  17. 苹果CMS采集参数全自动采集教程
  18. springboot利用官方SDK(wechatpay-apache-httpclient)接入微信支付V3
  19. 【Android】Logcat使用
  20. TSP问题——启发式算法求解

热门文章

  1. 用ipython 写spark
  2. 江西理工大学c语言程序设计,C语言程序设计
  3. arima模型 p q d 确定_基于ARIMA预测股指期货价格走势
  4. SparkSql常用命令操作
  5. NTU 笔记 6422quiz 复习(1~3节)
  6. matlab在电力行业中的仿真技术-MATLAB基于EKF算法估计电动汽车蓄电池的SOC
  7. 听说你想去大厂看学妹,带你看看字节跳动后端开发面试长啥样?
  8. 热词统计发现算法3则
  9. 【Linux】26_文件服务FTP Server
  10. 【Python进阶】_JSON