百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

八十七、Python | 十大排序算法系列(上篇)

off999 2024-10-27 11:53 28 浏览 0 评论

@Author:Runsen

@Date:2020/7/10

人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难,奋勇前行,不忘初心,砥砺前行,人生定会有所收获,不留遗憾 (作者:Runsen )

作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。决定今天比昨天要更加努力。

辣鸡的我决定继续更新Python教程,今天就开始了八十七、Python | 十大排序算法系列(上篇)。还有不到区区的十三篇,我快完成了。

如果把基础的数据结构与算法都自己亲自实现一遍,那么你已经比 90% 的 Python 程序员更优秀了。

关于排序就是下面的十大排序算法


冒泡排序

python实现冒泡排序的核心思想是通过从列表一端迭代循环元素,再通过一个循环让这个元素之后的元素相邻两个比较,从而依次将最大值移动到最末端,如下图示意。

Python冒泡排序的代码实现。

def bubble_sort(nums):
    for i in range(len(nums) - 1):
        for j in range(len(nums) - i - 1):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    return nums

选择排序

排序算法:首先搜索整个列表,找到最小项的位置,如果该位置不是列表的第1项,就交换这两个位置的元素。然后从列表的第2个元素开始,重复上述过程,直到算法达到整个过程的最后一个位置,图形解释如下

下面使用55、23、87、62、16数列从小到大的排序过程来说明选择排序法的演算流程。原始数据如图:

1、首先找到此数列中最小值后,与数列中的第一个元素交换,如下图所示。

从第二个值开始找,找到剩余数列中(不含第一个填充为绿色的数字)的最小值,再和第二个值交换,如下图所示。

从第三个值开始找,找到此数列中(不含第一、二个的最小值),再和第三个值交换,如下图

从第四个值开始找,找到剩余数列的最小值,再和第四个值交换,排序完成,如下图。

Python选择排序的代码实现。

def selectionSort(x):
   i = 0
   while i < len(x) - 1:
       minindex = i
       j = i + 1
       while j < len(x) :        
           if x[minindex] > x[j]:
               minindex = j
           j+= 1
       if minindex != i:
           swap(x,i,minindex)    
       i+= 1
   return x

插入排序

插入排序的实现思路顾名思义,就是不断地在一个已经是有序的数组中,寻找合适位置并插入新元素。

从后往前依次进行比较,如果待插入元素大于当前元素,则将待插入元素插入到当前元素的后一位,如果待插入元素小于当前元素,则将当前元素后移一位。不断重复该过程直至到数组的最后一位

Python插入排序的代码实现。

def insertion_sort(a):
    length = len(a)
    if length <=1:
        return 
    for i in range(1,length):
        j = i-1
        value = a[i]
        while j >=0:
            if a[j]<value:
                a[j+1] = value
                break
            else:
                a[j+1] = a[j]
                if j == 0:
                    a[j] = value 
            j -=1
        print(a)
    return a

希尔排序

希尔排序的基本思想是:把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。

随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

我们画个图来说明一下

上面的排序其实和冒泡排序很像,只不过冒泡排序是每次都是间隔为1相邻的两个之间进行比较,但希尔排序是间隔为step,还是有一定区别的。

Python 希尔排序的代码实现。

def shell_sort(list):
    n = len(list)
    gap = n // 2
    while gap >= 1:
        for j in range(gap, n):
            i = j
            while( i - gap ) >= 0:
                if list[i] < list[ i - gap ]:
                    list[i], list[ i - gap ] = list[ i - gap ], list[i]
                    i -= gap
                else:
                    break
        gap //= 2
        
if __name__ == '__main__':
    alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print("原列表为:%s" % alist)
    shell_sort(alist)
    print("新列表为:%s" % alist)

归并排序

归并排序的基本思想:将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

归并排序其实要做两件事:

(1)“分解”——将序列每次折半划分。

(2)“合并”——将划分后的序列段两两合并后排序。

Python 归并排序的代码实现。

def merge(left, right):
    i = 0
    j = 0
    temp = []
    while i <= len(left) - 1 and j <= len(right) - 1:
        if left[i] <= right[j]:
            temp.append(left[i])
            i += 1
        else:
            temp.append(right[j])
            j += 1
    temp += left[i:] + right[j:]
    return temp

print(merge([1,3,4],[2,3,3])) 

相关推荐

路由器密码锁解锁教程(路由器密码忘怎么设置)

1.路由器IP地址定位:通常而言,路由器在连接主网线之后,会广播一个自身的网络IP地址,一般如下:192.168.1.0,192.168.1.1,目前各大路由器厂商也会播出一些怪异的地址,比如10.1...

台式电脑键盘按键错乱怎么恢复

如果你的机械键盘按键错乱,你可以尝试将键盘连接到电脑上,然后通过按下“Ctrl”、“Alt”和“Del”键同时重启电脑,看看是否能够恢复默认设置。另外,你还可以尝试在控制面板中找到键盘设置,检查是否有...

移动硬盘格式化后还能用吗(移动硬盘格式化后数据会丢失吗)

当然可以使用!格式化只是里面的所有文件会没有,还可以再存储的。格式化(format)是指对磁盘或磁盘中的分区(partition)进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被...

手机系统升级好不好

手机系统并不是随时更新,都是好用的,手机主要针对你的处理器,如果老型使用年头比较多的手机,不建议更新系统,更新系统之后容易造成耗电量非常大,卡顿现象比较严重,而新出的手机产品处理器功率都偏大,这种手机...

win2003序列号企业版(win2003 enterprise序列号)

  Windows2003:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY  cky24-q8qrh-x3kmr-c6bcy-t847y  win2003EnterpriseServer:...

电脑c盘满了应该怎么办(如果电脑c盘满了怎么办啊)
电脑c盘满了应该怎么办(如果电脑c盘满了怎么办啊)

1、电脑桌面双击此电脑2、进入后找到Windows(C)盘,然后鼠标右击选择属性3、点击磁盘清理4、勾选需要清理的文件,最后点击确定即可1、运用磁盘清理软件清理C盘,大约可为C盘释放50M-800M空间。2、关闭休眠功能,在开始菜单的运行里...

2025-12-18 11:03 off999

win10桌面突然清空了(电脑桌面全部被隐藏了怎么恢复)

1、右键点击任务栏,然后选择任务管理器或按快捷键Ctrl+Shift+Esc;  2、打开任务管理器后,切换到详细信息模式。在进程中找到“桌面窗口管理器”(英文版系统找DesktopWindowM...

华硕笔记本全系列介绍(华硕笔记本全系列介绍视频)

关于这个问题,华硕笔记本一共有多个系列,每个系列定位不同。以下是华硕笔记本的主要系列及其定位:1.ASUSVivoBook(维沃系列):面向普通用户和学生,注重轻薄、时尚设计和价格实惠。2.AS...

华为笔记本电脑i5和i7区别(华为笔记本电脑i5和i7区别是什么)

主要是性能上的区别。如果将CPU比作火车运输,那么i5等于4条高铁,i7可以是6条或者8条高铁,运输量倍数增加。i7可以看作是i5的高配版。功能不同。i5和i7两个版本,其主要区别是在处理器的频率不...

如何下载office2007办公软件
  • 如何下载office2007办公软件
  • 如何下载office2007办公软件
  • 如何下载office2007办公软件
  • 如何下载office2007办公软件
u盘启动蓝屏(联想电脑进入u盘启动蓝屏)
u盘启动蓝屏(联想电脑进入u盘启动蓝屏)

电脑插入U盘后蓝屏的原因如下:1、Windows的系统分区存在磁盘错误或文件错误2、主板的SATA或IDE控制器驱动程序受到了损坏或安装不正确3、计算机遭到了病毒木马、流氓软件等恶意程序的攻击解决办法如下:1、执行磁盘扫描程序对所有的磁盘驱...

2025-12-18 08:51 off999

下载新版微信并安装(下载新版微信并安装到手机)

1.首先打开手机的浏览器,在搜索栏中输入微信官网,并点击搜索。2.出现微信后点击下载,下载完成后,点击安装。   3.安装完成后,再回到桌面,点击“微信”4.输入账号密...

测速在线测试(测速在线测试高铁)

回答:不靠谱。例如:SPEEDTEST是一家叫Ookla的公司开发的测速工具,稍有经验的朋友想必对它都不会陌生。Ookla在全世界各地维护了大量测速节点,SPEEDTEST测量的就是与这些测速节点间的...

格式工厂免费版(格式工厂免费版破解版)

不收费用格式工厂是由上海格式工厂网络有限公司创立于2008年2月,是面向全球用户的互联网软件。格式工厂发展至今,已经成为全球领先的视频图片等格式转换客户端。格式工厂致力于帮用户更好的解决文件使用问题,...

路由器连接电脑插哪个端口(路由器跟电脑的连接线怎么插)

电脑连接路由器插入路由器LAN口。具体方法如下1、光纤或网线插到路由器的WAN口上,(或网线连接modem的line口,modem的lan口连接了无线路由的wan口);2、电脑网线从路由器的LAN口上...

取消回复欢迎 发表评论: