Python冒泡排序算法及其优化「建议收藏」

Python冒泡排序算法及其优化「建议收藏」冒泡排序所谓冒泡,就是将元素两两之间进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。(图中排好序的元素标记为黄色柱子)冒泡排序动图演示上python代码:defbubble_sort(items):foriinrange(len(items)-1):…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

冒泡排序

所谓冒泡,就是将元素两两之间进行比较,谁大就往后移动,直到将最大的元素排到最后面,接着再循环一趟,从头开始进行两两比较,而上一趟已经排好的那个元素就不用进行比较了。(图中排好序的元素标记为黄色柱子)

Python冒泡排序算法及其优化「建议收藏」
冒泡排序动图演示

python代码:

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


list1 = [2,1,9,11,10,8,7]
print(bubble_sort(list1))

输出结果:

[1, 2, 7, 8, 9, 10, 11]

这是冒泡排序最普通的写法,但你会发现它有一些不足之处,比如列表:[1,2,3,4,7,5,6],第一次循环将最大的数排到最后,此时列表已经都排好序了,就是不用再进行第二次、第三次…

冒泡排序优化一:

设定一个变量为False,如果元素之间交换了位置,将变量重新赋值为True,最后再判断,在一次循环结束后,变量如果还是为False,则brak退出循环,结束排序。

def bubble_sort(items):
    for i in range(len(items) - 1):
        flag = False
        for j in range(len(items) - 1 - i):
            if items[j] > items[j + 1]:
                items[j], items[j + 1] = items[j + 1], items[j]
                flag = True
        if not flag:
            break
    return items

冒泡排序优化二:搅拌排序 / 鸡尾酒排序

上面这种写法还有一个问题,就是每次都是从左边到右边进行比较,这样效率不高,你要考虑当最大值和最小值分别在两端的情况。写成双向排序提高效率,即当一次从左向右的排序比较结束后,立马从右向左来一次排序比较。

Python冒泡排序算法及其优化「建议收藏」
双向排序动图演示

python代码:

def bubble_sort(items):
    for i in range(len(items) - 1):
        flag = False
        for j in range(len(items) - 1 - i):
            if items[j] > items[j + 1]:
                items[j], items[j + 1] = items[j + 1], items[j]
                flag = True
        if flag:
            flag = False
            for j in range(len(items) - 2 - i, 0, -1):
                if items[j - 1] > items[j]:
                    items[j], items[j - 1] = items[j - 1], items[j]
                    flag = True
        if not flag:
            break
    return items

冒泡排序优化三:

最后要考虑的情况就是,如果给你的不是列表,而是对象,或者列表里面都是字符串,那么上述的代码也就没有用了,这时候你就要自定义函数了,并将其当成参数传入bubble_sort函数

python代码:

def bubble_sort(items, comp=lambda x, y: x > y):
    for i in range(len(items) - 1):
        flag = False
        for j in range(len(items) - 1 - i):
            if comp(items[j],items[j + 1]):
                items[j], items[j + 1] = items[j + 1], items[j]
                flag = True
        if flag:
            flag = False
            for j in range(len(items) - 2 - i, 0, -1):
                if comp(items[j - 1],items[j]):
                    items[j], items[j - 1] = items[j - 1], items[j]
                    flag = True
        if not flag:
            break
    return items

list2 = ['apple', 'watermelon', 'pitaya', 'waxberry', 'pear']
print(bubble_sort(list2,lambda s1,s2: len(s1) > len(s2)))  #按照字符串长度从小到大来排序

输出结果:

['pear', 'apple', 'pitaya', 'waxberry', 'watermelon']

类似的,当有人叫你给一个类对象排序时,也可以传入lambda 自定义函数。

class Student():
    """学生"""

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'{self.name}: {self.age}'

items1 = [
        Student('Wang Dachui', 25),
        Student('Di ren jie', 38),
        Student('Zhang Sanfeng', 120),
        Student('Bai yuanfang', 18)
    ]

print(bubble_sort(items1, lambda s1, s2: s1.age > s2.age))

输出结果:按照年龄从小到大排序

[Bai yuanfang: 18, Wang Dachui: 25, Di ren jie: 38, Zhang Sanfeng: 120]

 

以上就是关于冒泡排序的原理,以及一些优化写法,希望看完对你会有所帮助~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181713.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月15日 下午2:36
下一篇 2022年10月15日 下午2:46


相关推荐

  • 泰勒(Taylor)展开式(泰勒级数)

    泰勒(Taylor)展开式(泰勒级数)目录泰勒公式余项 1 佩亚诺 Peano 余项 2 施勒米尔希 罗什 Schlomilch Roche 余项 3 拉格朗日 Lagrange 余项 4 柯西 Cauchy 余项 5 积分余项 带佩亚诺余项参考资料泰勒公式泰勒公式是将一个在 x x0 处具有 n 阶导数的函数 f x 利用关于 x x0 的 n 次多项式来逼近函数的方法 若函数 f x 在包含 x0 的某个

    2026年3月18日
    1
  • Linux下如何解压rar文件「建议收藏」

    Linux下如何解压rar文件「建议收藏」在windows下我们压缩解压文件通常后缀为rar,在linux下我们压缩解压文件通常后缀为tar默认在linux下我们不能解压压缩rar文件,那我们如何使用呢?我们可以下载rarlinux安装包

    2022年6月30日
    23
  • 怎么在mac上录屏_录屏工具

    怎么在mac上录屏_录屏工具您可以为整个屏幕或屏幕上的选定部分录制视频。1、使用“截屏”工具栏要查看“截屏”工具栏,请同时按下以下三个按键:Shift、Command和5。您将看到用于录制整个屏幕、录制屏幕的选定部分或拍摄屏幕静态图像的屏幕控制项:录制整个屏幕点按屏幕控制项中的。指针会变为相机。 点按任意屏幕以开始录制屏幕,或点按屏幕控制项中的“录制”。 要停止录制,请点按菜单栏中的。或者,按下Command-Control-Esc(Escape)。 使用缩略图进行修剪、共享、存储或其他操作…

    2026年3月5日
    4
  • icem划分网格步骤_ICEM CFD教程-icem网格划分教程

    icem划分网格步骤_ICEM CFD教程-icem网格划分教程ICEMCFD教程四面体网格对于复杂外形,ICEMCFDTetra具有如下优点:根据用户事先规定一些关键的点和曲线基于8叉树算法的网格生成,生成速度快,大约为1500cells/second无需表面的三角形划分,直接生成体网格四面体网格能够合并到混合网格中,并实施平滑操作单独区域的粗化和细化ICEMCFD的CAD(CATIAV4,UG,ProE,IGES,andP…

    2022年5月9日
    49
  • MySQL游标_oracle游标超限

    MySQL游标_oracle游标超限1.简单介绍从MySQL5开始添加了对游标(cursor)的支持,使用游标可以很方便的在查询出来的结果集上获取第一行、最后一行、上一行或下一行等一系列的操作。游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。MySQL游标只能用于存储过程和函数中。2….

    2025年7月31日
    5
  • java queryinterface_JS和C#访问遇到QueryInterface调用出错「建议收藏」

    java queryinterface_JS和C#访问遇到QueryInterface调用出错「建议收藏」在原来的WinForm里,我们只要在窗体类的头部添加属性[System.Runtime.InteropServices.ComVisibleAttribute(true)],然后webBrowser1.ObjectForScripting=this;这样设置完后,页面上的JS就能访问窗体类的方法了,但是添加WeifenLuo.WinFormsUI.Docking.DockContent作为窗…

    2022年6月16日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号