python排序算法之希尔排序

 更新时间:2023年04月23日 09:46:36   作者:i阿极  
这篇文章主要介绍了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 = 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]

总结

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

到此这篇关于python排序算法之希尔排序的文章就介绍到这了,更多相关python 希尔排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解python日期时间处理2

    详解python日期时间处理2

    这篇文章主要为大家介绍了python日期时间处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • matplotlib基本图形绘制操作实例

    matplotlib基本图形绘制操作实例

    这篇文章主要为大家介绍了matplotlib基本图形绘制操作实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 基于Python开发图片分割器

    基于Python开发图片分割器

    在图像处理领域,经常需要将一张大图切分成多个小图片,本文将介绍如何使用Python开发一个带图形界面的图片分割工具,有需要的可以参考一下
    2024-12-12
  • python boto和boto3操作bucket的示例

    python boto和boto3操作bucket的示例

    这篇文章主要介绍了python boto和boto3操作bucket的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • Python实现识别图片为文字的示例代码

    Python实现识别图片为文字的示例代码

    这篇文章主要为大家详细介绍了Python如何不调用三方收费接口,照样实现识别图片为文字的功能。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-08-08
  • python 如何对Series中的每一个数据做运算

    python 如何对Series中的每一个数据做运算

    这篇文章主要介绍了python 实现对Series中的每一个数据做运算操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python内建序列通用操作6种实现方法

    Python内建序列通用操作6种实现方法

    这篇文章主要介绍了Python内建序列通用操作6种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python简单实现查找一个字符串中最长不重复子串的方法

    Python简单实现查找一个字符串中最长不重复子串的方法

    这篇文章主要介绍了Python简单实现查找一个字符串中最长不重复子串的方法,涉及Python针对字符串的简单遍历、运算等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • python登录QQ邮箱发信的实现代码

    python登录QQ邮箱发信的实现代码

    python登录QQ邮箱发信的代码,有需要的朋友可以参考下
    2013-02-02
  • 通过python检测字符串的字母

    通过python检测字符串的字母

    这篇文章主要介绍了通过python检测字符串的字母,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论