冒泡排序算法原理和代码实现,就是这么简单!

冒泡排序,是比较简单的一种排序算法。

它的命名源于它的算法原理:重复的从前往后(或者从后往前),依次比较记录中相邻的两个元素,如果他们顺序错误就把它们交换过来,直到没有再需要交换的元素,就说明该记录已完成排序。
它看起来就像是把最大的元素(或最小的元素)经由交换慢慢的‘浮’到数列的顶端,故名冒泡排序。

算法原理


我们通过将一个无序数列按升序排序来演示算法原理。

算法流程:

1. 比较相邻元素,如果第一个比第二个大,就交换它们两个。


2. 对每一组相邻元素做同样的工作,从开始到最后一对,这时最后的元素应该会是最大的数。


3. 针对所有元素重复步骤 1,2,除了最后一个元素,这时倒数第二个元素应该会是第二大的数。


4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

图解步骤:

有一个数列 [4, 2, 6, 5, 3, 9],通过冒泡排序的步骤如下:

代码实现


总结:

1、一个长度为 n 的数列,我们最多需要进行 n-1 轮比较

2、第 m 轮,需要 n-m-1 次比较

根据上述思想,使用 python 代码来实现:

l = [1, 7, 5, 6, 2, 8, 3, 9, 4]
n = len(l)
for m in range(n-1):  # 外层循环决定需要排序的轮次
    for i in range(n-m-1):  # 内层循环决定要比较的次数
        if l[i] > l[i+1]:
            l[i], l[i+1] = l[i+1], l[i]
    print(l)

输出结果:

[1, 5, 6, 2, 7, 3, 8, 4, 9]
[1, 5, 2, 6, 3, 7, 4, 8, 9]
[1, 2, 5, 3, 6, 4, 7, 8, 9]
[1, 2, 3, 5, 4, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]  # 到这里其实已经排序结束了
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

可以看到:循环进行了 5 次就得到了正确的结果,但是程序还是进行了剩下的循环。对上面的程序进行优化,得到下面的改进版。

l = [1, 7, 5, 6, 2, 8, 3, 9, 4]
n = len(l)
for m in range(n-1):
    flag = True  # 设置一个标志位
    for i in range(n-m-1):
        if l[i] > l[i+1]:
            l[i], l[i+1] = l[i+1], l[i]
            flag = False  # 如果本能循环还需要交换就改变flag的值
    if flag:  # 如果flag没有改变就说明排序成功了
        break
    print(l)

运行结果:

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

分析总结


1. 时间复杂度

  • 若列表的初始状态是正序的,一趟扫描即可完成排序。所需的比较次数 C 和移动次数 M 均为最小值:
    C=n-1,M=0,所以冒泡排序的最好时间复杂度为 O(n)

  • 若列表的初始状态是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次比较,且每次比较都必须移动记录 2 次来达到交换记录的位置。在这种情况下比较和移动次数均达到最大值
    C = n(n-1)/2=O(n2),M=2n(n-1)/2=O(n2)
    冒泡排序的最坏时间复杂度为 O(n2)
    综上,冒泡排序的平均时间复杂度为 O(n2)

2. 空间复杂度

冒泡排序算法过程中内存空间稳定,所以空间复杂度为 O(1)

3. 稳定性分析

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

4. 应用分析

因为冒泡排序的时间复杂度为 O(n2),一般应用于小规模数据的排序。且冒泡排序逻辑比较简单,易于理解,一般会用于教学。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/139378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟人高清视频渲染宝藏工具:RenderHare飞兔渲染软件

在数字时代,品牌为了抢占年轻人群体,纷纷涌入虚拟人IP赛道,通过虚拟人IP运营模式,构建独特的虚拟人IP记忆符号,向粉丝输出品牌潮流、年轻化的价值观,扩散虚拟IP影响力,让品牌真正与消费者玩在一…

基于注解的声明式事务

1.什么是事务 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2.事务的特性 A:原子性(A…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大,静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因,选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时,如果CDN节…

腾讯待办停运后怎么办呢?导出的ics文件怎么打开查看

待办类工具在日常工作中的应用是比较广泛的,很多人会选择使用待办软件记录备忘事项,其中一些提醒类的工具是比较广泛使用的。腾讯待办属于一款待办事项和日程管理工具,它通常是以微信小程序的形式,为大家提供时间管理规划&#xf…

应急响应练习2

目录 1. 请提交攻击者的ip与系统版本 2. 攻击者通过某个组件漏洞获得服务器权限,请提交该组件的名称 3. 请提交攻击者首次攻击成功的时间 4. 请提交攻击者上传的webshell文件绝对路径 5. 请提交攻击者使用的webshell管理工具 6. 攻击者进一步留下的免杀的webs…

AGV与AMR的区别

如今,市面上最受关注的两类工业移动机器人分别是AGV和AMR。但大众对于两者的区别还是不甚了解,因此小编将通过这篇文章为大家详细解释。 一、概念阐述 【AGV 】 AGV (Automated Guided Vehicle) 即自动导引运输车,可指基于各种定位导航技术…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去,特意用了明黄色字体,如下查看答案: 选择题 2-1 下述程序段的时间复杂度为&am…

独立站商品信息是怎么获取的呢

独立站商品信息的获取主要通过以下几种方式: 人工收集:卖家可以通过在各个电商平台、网站等渠道进行手动搜索和收集商品信息,包括商品名称、价格、描述、图片等,然后将其导入到自己的独立站中。使用采集工具:目前市面…

暖手宝上架亚马逊美国站UL499报告测试标准要求

暖手宝是运用物理及化学原理研制的自动取暖保健用品。该产品以其自动生热,有趣,实用等新颖独特的优势,深受欢迎——暖手宝具有自动取暖,理疗保健等多种功能。只要插上电源等上10分钟左右就能发热,最后一种是通过锂电池…

arcgis--消除坐标系信息的两种方法

方法一:在【目录】中右击待修改数据,选择【属性】,选择【XY坐标】选项卡,点击清楚按钮。 方法二:在【数据管理工具】-【投影与变换】-【定义投影】中清楚坐标系信息。如下:

如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录 在这里的图像拼接画指的是一张大图由很多小图组成,效果就像这样: 原理:将大图拆成很多小块,每一块计算平均颜色,用平均颜色最相近的小图来替代,就可以。 直接遍历就可以&…

FFmpeg开发简介1

适逢FFmpeg6.1发布,准备深入学习下FFmpeg,将会写下系列学习记录。 在此列出主要学习资料,后续再不列,感谢这些大神的探路和分享,特别是雷神,致敬! 《FFmpeg从入门到精通》 《深入理解FFmpeg》 …

使用Nginx和uwsgi在自己的服务器上部署python的flask项目

Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发,性能是其最重要的考量指标,实现上非常注重效率,能经受…

Structure-Inferred Bi-level Model for Underwater Image Enhancement论文小结

背景 随着水下机器人的发展,水下图像增强引起了计算机视觉界越来越多的关注。然而,由于光线在水中传播时会被散射和吸收,水下捕捉到的图像往往存在偏色和能见度低的问题。现有的方法依赖于特定的先验知识和训练数据,在缺乏结构信…

无人地磅称重系统|自助过磅 料仓联动 自助卸料

上海思伟无人地磅系统 自助过磅、 自助卸料 、料仓联动 智能、省人、安全 无人监管过磅 对地磅及其相关的所有硬件进行配置和管理; 支持红外、道闸、车牌识别、AI分析、拍照存档、LED语音播报一体机等设备; 实现稳定可靠的无人监管称重功能&#xf…

安防监控系统EasyCVR v3.4.0版本首页界面更新调整功能大汇总

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

C# 智慧医学实验室LIS系统源码,支持预制条码和即时打印条码;支持单工/双工数据采集;支持TAT监测与分析;具备检验智能审核功能,支持自定义多级审核规则

C#医院检验信息管理系统源码,智慧医学实验室LIS系统源码,云LIS系统源码 医院检验信息管理系统,利用计算机网络技术、数据存储技术、快速处理技术,对检验科进行全方位信息化管理,使检验科达到自动化运行,信息…

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示,使用flake8单行字数过长,就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json,发现我已经进…

体验家XMPlus收购NPSMeter,稳固体验管理行业“领头羊”地位

2023年9月30日,体验家XMPlus(以下简称“体验家”)成功完成了对NPSMeter的收购。此次收购是中国客户体验管理(CEM)赛道进入快速发展以来的首单收购,标志着体验家在CEM领域的进一步扩张,旨在继续完…

智慧工地管理云平台源码,Spring Cloud +Vue+UniApp

智慧工地源码 智慧工地云平台源码 智慧建筑源码支持私有化部署,提供SaaS硬件设备运维全套服务。 互联网建筑工地,是将互联网的理念和技术引入建筑工地,从施工现场源头抓起,最大程度的收集人员、安全、环境、材料等关键业务数据&am…
最新文章