python排序算法之希尔排序

作者:i阿极 时间:2023-03-03 13:50:48 

一、前言

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

二、算法描述

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

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

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

第一步:

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

python排序算法之希尔排序

第二步:

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

python排序算法之希尔排序

第三步:

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

python排序算法之希尔排序

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

第四步:

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

python排序算法之希尔排序

第五步:

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

python排序算法之希尔排序

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

三、代码实现

在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 = i
    while ind >= step and nums[ind] < nums[ind-step]: #对每组进行插入排序
     nums[ind],nums[ind-step] = nums[ind-step],nums[ind]
     ind -= step
  step //= 2#增量缩小一半
 print(nums)
ShellSort(nums)

运行程序,输出结果为:

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

总结

来源:https://blog.csdn.net/AOAIYI/article/details/128717484

标签:python,算法,希尔,排序
0
投稿

猜你喜欢

  • Linux下rpm方式安装mysql教程

    2024-01-21 07:40:53
  • go mode tidy出现报错go: warning: “all“ matched no packages的解决方法

    2024-02-04 22:35:14
  • Python 图形界面框架TkInter之在源码中找pack方法

    2021-10-06 05:10:56
  • PHP之数组学习

    2024-05-02 17:35:43
  • python orm 框架中sqlalchemy用法实例详解

    2021-04-22 18:03:28
  • Python 正则表达式详解

    2021-12-03 11:11:38
  • pandas去除重复列的实现方法

    2022-06-27 12:37:31
  • python3中的logging记录日志实现过程及封装成类的操作

    2023-07-30 21:58:21
  • vue element-ui实现动态面包屑导航

    2024-05-02 17:11:36
  • 详解Python描述符的工作原理

    2022-03-16 19:02:59
  • pytorch对可变长度序列的处理方法详解

    2022-11-11 23:19:39
  • python for循环内输出和外输出方式

    2022-09-25 10:19:06
  • 基于Python使用永中文档转换服务的方式

    2021-09-29 12:26:12
  • python判断windows系统是32位还是64位的方法

    2023-08-08 15:17:04
  • centos6.7 安装python2.7、pip2.7、easy_install-2.7的方法

    2021-02-06 09:20:35
  • 一篇文章彻底搞懂Python切片操作

    2021-10-11 18:23:07
  • mysql如何配置白名单访问

    2024-01-25 15:43:20
  • “你帮我把这个做成这个样子!”—当我听到这句话

    2009-04-16 12:57:00
  • Go语言算法之寻找数组第二大元素的方法

    2023-06-24 16:19:03
  •  Go 语言实现 HTTP 文件上传和下载

    2023-06-23 01:42:24
  • asp之家 网络编程 m.aspxhome.com