数据结构与算法笔记(九)—— 希尔排序
什么是希尔排序
希尔排序(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]
数据结构与算法笔记(九)—— 希尔排序相关推荐
- Hark的数据结构与算法练习之希尔排序
算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...
- 数据结构与算法笔记(青岛大学王卓老师视频)
写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...
- JS数据结构与算法 笔记
JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...
- 数据结构与算法笔记 - 绪论
数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...
- python程序结构有哪几种_Python数据结构与算法(几种排序)小结
Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...
- 算法笔记(JavaScript版)——排序
算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...
- 数据结构:从插入排序到希尔排序
数据结构:从插入排序到希尔排序 插入排序 算法思路 每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程. n个待排序的元素由一个有序表和一个无序表组成,开 ...
- 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序
<数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...
- 数据结构与算法笔记(十六)—— 二叉搜索树
一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...
- 数据结构与算法笔记(十五)—— 散列(哈希表)
一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...
最新文章
- jQuery获取带点的id元素
- ICCV 2019:谷歌获最佳论文!中国入选论文最多,中科院、清华领跑
- Python、Lua和Ruby比较——脚本语言大P.K.
- web页面--前端明水印
- Feature Pyramid Networks for Object Detection 论文笔记
- linux一路填坑...
- vue-resource使用
- presto领读 查询引擎翻译
- oracle查询语句大全(oracle 基本命令大全一)
- 你需要知道的那些 redis 数据结构(前篇)
- php阅读器开发,微信小程序阅读器的简单实例开发
- java创建子类对象的步骤_一通Spring骚操作:我敢说没人比我更懂Java对象创建
- php里的header,PHP中常用的header头部定义有哪些
- CINNO:2025年全球折叠屏智能手机销量有望超5700万部
- 石头高墙怎么放_朱良志:古人对石头的审美
- linux操作实例,linux下的一些文档操作实例 | Soo Smart!
- 苹果CMS采集参数全自动采集教程
- springboot利用官方SDK(wechatpay-apache-httpclient)接入微信支付V3
- 【Android】Logcat使用
- TSP问题——启发式算法求解