希尔排序,又叫“缩小增量排序”,是对插入排序进行优化后产生的一种排序算法。它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增量到达 1。

一般来说,希尔排序的时间复杂度为 O(n1.3)~O(n2),它视增量大小而定。希尔排序的空间复杂度是 O(1),它是一个不稳定的排序算法。进行希尔排序时,元素一次移动可能跨越多个元素,从而可能抵消多次移动,提高了效率。

下面是使用(数组长度/2)作为初始增量的升序希尔排序,每一轮排序过后,增量都缩小一半。

1) 如图 1 所示,从第一个元素开始,以增量 4 来分组。可以看出,当增量为 4 时,一组内只有两个元素,否则元素的下标就超出了数组的范围。

图 1:第一轮第一步

2) 如图 2 所示,对组内的元素进行插入排序。

图 2:第一轮第二步

3) 如图 3 所示,继续用相同的方法分组,对组内的元素进行插入排序使得它们有序。

图 3:完成第一轮排序

整个数组内的数都被遍历完成后,这一轮排序就结束了。把增量缩小一半,继续进行下一轮排序。

4) 如图 4 所示,增量为 2 时,可以看出每一组内的元素增多了,组的总数减少了。继续对每一组内的元素进行插入排序,直到每一组都遍历完成。

图 4:第二轮排序

5) 最后一轮排序如图 5 所示,再次把增量缩小一半;这时增量为 1,相当于对整个数组进行插入排序,也就是最后一轮排序。

图 5:第三轮排序

最后一轮排序结束后,整个希尔排序就结束了。

希尔排序代码:

nums = [5,3,6,4,1,2,8,7]
def ShellSort(nums):step = len(nums)//2         #初始化增量为数组长度的一半while step > 0:           #增量必须是大于0的整数for i in range(step,len(nums)): #遍历需要进行插入排序的数ind = iwhile ind >= step and nums[ind] < nums[ind-step]: #对每组进行插入排序nums[ind],nums[ind-step] = nums[ind-step],nums[ind]ind -= stepstep //= 2           #增量缩小一半print(nums)
ShellSort(nums)

运行程序,输出结果为:

[1,2,3,4,5,6,7,8]

在 for 循环中,由于每组的第一个元素不用进行插入排序,而它们的下标处于 0~step-1,所以从下标 step 开始遍历。

需要注意的是,如果要模拟流程图中的做法,要使用两个循环:先分组,然后一次性使同组内的元素有序。为了提高效率,我们直接使用一个 for 循环,每遍历到一个数,就对它所在的组进行插入排序。这样遍历同样符合插入排序的顺序要求。在插入排序中,要改变当前下标的值,所以使用变量 ind 存储当前下标,防止影响 for 循环。

普通插入排序等同于增量为 1 的希尔排序,跨元素的希尔排序实际上只改变了增量,逻辑上与普通插入排序没有区别。

【python算法系列三】 希尔排序算法相关推荐

  1. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  2. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  3. 排序算法系列:Shell 排序算法

    概述 希尔排序(Shell Sort)是 D.L.Shell 于 1959 年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是 O(n2n^{2}n2) 的,希尔排序算法是突破这个时间复杂度 ...

  4. 【数据结构----笔记5】插入排序算法之【希尔排序算法】

    /*__________________________________________________________________________________________________ ...

  5. 白话经典算法系列之——希尔排序的实现

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的 ...

  6. 算法系列【希尔排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入 ...

  7. python算法与数据结构-希尔排序算法

    希尔排序(shell sort)是插入排序的一种,也称缩小增量排序,与普通的插入算法的区别就是gap步长. 希尔排序内层循环逻辑如下所示: 上面的可以分为4组,一个一个的按照插入算法来做,第一组有54 ...

  8. 算法系列之五 希尔排序

    对于前面讲过的基础排序来说,他们在实际使用的时候,价值并不是太大.它的价值在于,体现了一种很好的思想.通过一些改进和变化,可以达到一个不错的性能.希尔排序就是典型的一个例子,它改进了插入排序,使得算法 ...

  9. 死磕算法第三弹——排序算法(2)

    本文整理来源 <轻松学算法--互联网算法面试宝典>/赵烨 编著 插入排序 什么是插入排序 插入排序分为两种,一种是直接插入排序,一种是二分法插入排序.这两种排序实际上都是插入排序,唯一的不 ...

  10. 死磕算法第三弹——排序算法(1)

    本文整理来源 <轻松学算法--互联网算法面试宝典>/赵烨 编著 算法基础 对于算法性能分析来说,除了时间复杂度,还是有空间复杂度.稳定性等指标.而我们平时说的算法的复杂度可以分为两个部分: ...

最新文章

  1. Confluence 6 数据库表-空间(Spaces)
  2. 新概念C语言能力教程练习3答案,新概念C语言教程答案参考(自做)中国电力
  3. PHP利用反射根据类名反向寻找类所在文件
  4. ubuntu shell实现99乘法表
  5. 计算机视觉与深度学习 | ORB特征提取:基于OpenCV+Python(附代码)
  6. 统计 表格_电商运营表格合集,运营统计绩效策划,全套excel表拿来就用
  7. cf246E. Blood Cousins Return
  8. 调整idea中控制台及右侧提示框字体大小
  9. Ubuntu 汉字显示一半的修复
  10. leetcode28 Implement strStr() 在字符串中寻找目标字符串
  11. C++ STL unordered_map按照value排序
  12. 怎么避免后台被搜索_优化亚马逊后台关键词的6个技巧,让买家快速找到你
  13. 树莓派自启动配置端口映射及启动jar
  14. 龙管家计费系统服务器连接失败,龙管家网吧计费系统服务端安装步骤
  15. 智能网联V2X全球发展现状以及V2X平台设计简介
  16. word自带参考文献标注功能—以word2013为例
  17. 想知道手机配音软件哪个好用吗?一起来看看吧
  18. cshop是什么开发语言_2019编程语言哪一款最适合你?
  19. flutter widget super(key: key)的作用(五)
  20. 广告位Banner设计(推广产品、游戏)

热门文章

  1. 微博推广方法解答,要注意这些!
  2. 干货分享 | 诺奖表观应用技术之KAS-seq助力转录活性调控研究
  3. JavaScript详解一
  4. 2021年高压电工最新解析及高压电工模拟考试题库
  5. 最新emoji表情代码大全_2020父亲节快乐祝福语大全简短 最新温馨的父子节动态表情图片...
  6. 使用POI处理Word为HTML并将HTML中数据整合为所需要的对象形式
  7. 【100DAYSCSS#90】追踪鼠标
  8. 计算机技术三大支柱,现代工业自动化的三大技术支柱是()。
  9. python关联规则挖掘_python数据挖掘 pycaret.arules 关联规则学习
  10. 心跳包(检测不可检测断线)