python排序算法——希尔排序


文章目录

  • python排序算法——希尔排序
  • 一、前言
  • 二、算法描述
  • 三、代码实现
  • 总结

一、前言

相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。相比起初级排序算法,高级排序算法往往有更加复杂的逻辑,但也会有更高的时间或空间效率。其中有些高级排序算法是由初级排序算法优化而来的。

二、算法描述

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

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

下面是使用(数组长度/2)作为初始增量的升序希尔排序,每一轮排序过后,增量都缩小一半。第一步:如图2-28所示,从第一个元素开始,以增量4来分组。可以看出,当增量为4时,一组内只有两个元素,否则元素的下标就超出了数组的范围。

第二步:如图2-29所示,对组内的元素进行插入排序。

第三步:如图2-30所示,继续用相同的方法分组,对组内的元素进行插入排序使得它们有序。

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

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


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


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

三、代码实现

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

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

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

希尔排序代码:

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]

总结

以上就是本文要讲的内容,本文介绍了希尔排序的理论知识和代码实现。一般来说,希尔排序的时间复杂度为O(n1.3)~O(n2),它视增量大小而定。希尔排序的空间复杂度是O(1),它是一个不稳定的排序算法。

python排序算法——希尔排序(附代码)相关推荐

  1. 经典排序算法 - 希尔排序Shell sort

    经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第 ...

  2. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 排序算法——希尔排序的图解、代码实现以及时间复杂度分析

    希尔排序(Shellsort) 希尔排序是冲破二次时间屏障的第一批算法之一. 希尔排序通过比较相距一定间隔的元素来工作:各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.由 ...

  4. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  5. python排序算法 ——冒泡排序(附代码)

    python排序算法 --冒泡排序 文章目录 python排序算法 --冒泡排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  6. 排序算法——希尔排序(缩小增量排序)

    1.希尔排序思想: 希尔排序就是把数据分成若干份子序列,从第一个元素开始,和每间隔为n的元素分成一个子序列,对每一份子序列实行直接插入排序,然后合并成一个新序列,继续对新序列以间隔m分成若干份,继续重 ...

  7. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

  8. 希尔排序是一种稳定的排序算法_排序算法—希尔排序

    希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n ...

  9. 排序算法——希尔排序

    希尔排序是1959 年由D.L.Shell提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录&q ...

最新文章

  1. 通过一个案例理解 JWT
  2. RDKit:运用RDKit计算USRCAT
  3. 参加第十届的队员给智能车竞赛的建议:抄能力+钞能力使得一届不如一届
  4. Git的分支命令详解
  5. (chap4 IP协议) 全局地址和私有地址
  6. postgresql 删除触发器_PostgreSQL:我没有带闪,不讲武德
  7. Javaweb学习路线(自学规划)
  8. 语言求圆周率近似值改错_新证明解决了如何求无理数的近似值
  9. ESP32 入门教学,不入门,不教学
  10. php100的阶乘代码while语句,编写PHP程序,使用while循环计算4096是2的几次方,然后输出结果...
  11. 报表开发工具FastReport开源代码2020首发更新!邀您免费下载
  12. 影视剪辑,12天自学视频剪辑入门规划
  13. 佳蓝php智能应答系统|在线客服 v1.0,佳蓝PHP智能应答系统|在线客服 v1.0
  14. 不服?来战!2017 CCF BDCI百万元巨奖各有所属
  15. URAL 1741 Communication Fiend dp
  16. [2001年写的小说]星际争霸之外传
  17. 快来和网红 ChatGPT 聊天!!
  18. 计算机驱动安装的几个方法,不会安装驱动有福了,2个方法教你安装驱动程序,非常实用的知识...
  19. Linux curses库使用
  20. 使用Gin框架集成JWT,源码、详解、面试问题

热门文章

  1. pillow 目标检测 画框 抠图
  2. 明道云技术路径选择及与LCDP的比较
  3. 汇编程序设计:lib库的使用以及建立宏库
  4. Python皮尔逊相关系数
  5. 详细版mongodb下载安装教程----windows版
  6. 真正成熟的人具备的美好品质
  7. 不同设备拿到了相同的mac地址(arp和nbtstat)
  8. 京东二面扑街咯,全力以赴, 三月之期已到,这次终于拿下offer!
  9. linux内存管理笔记(四十一)----swap分区
  10. 不工作,靠海外抖音(TikTok)还清所有债务:会赚钱的人都在做这件事 !