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

news2024/12/25 8:59:22

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

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

算法原理


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

算法流程:

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.coloradmin.cn/o/1203111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

群晖NAS:内网穿透、异地组网 frp

群晖NAS:内网穿透、异地组网 星空-远程访问(推荐高速) https://ip4.ink/ cpolar极点云(简单易用) https://www.cpolar.com/ 内网穿透矿神教程 https://imnks.com/4406.html 1、公网最好了,IPV4参考&…

说说 Real DOM 和 Virtual DOM 的区别?优缺点?

一、是什么 Real DOM,真实 DOM,意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实 DOM 结构,如下: Virtual Dom,本质上是以 JavaScript 对象形式存在的对 DOM 的描述 创建虚拟 DOM 目的就是为了更好将虚拟的节点渲染到页面视图中,虚拟…

数字孪生智慧园区:大数据驱动下的运营管理革新

随着物联网、大数据、云计算等技术的飞速发展,数字孪生技术应运而生,它将物理世界与数字世界紧密连接起来,为各行各业提供了前所未有的解决方案。智慧园区作为城市的重要组成部分,通过数字孪生技术,可以实现更加高效、…

Go,14周年[译]

国内的双十一购物狂欢已没有了当年的那种热闹与喧嚣,但大洋彼岸的Go团队却始终保持稳中有增的开发和语言演进节奏。今晨Go核心团队的Russ Cox[1]代表Go语言项目团队在Go官博上发表了《Fourteen Years of Go》[2]的博文,纪念Go语言开源14周年[3]&#xff…

腾讯云服务器多少钱一年?腾讯云优惠服务器有哪些?

随着互联网的发展,越来越多的企业和个人选择将自己的业务部署在云服务器上。腾讯云作为国内领先的云服务提供商之一,其服务器价格也备受关注。 对于腾讯云优惠服务器,腾讯云会不定期推出一些促销活动,例如新用户优惠、老用户回馈…

桥接模式(结构型)

目录 一、前言 二、桥接模式 三、总结 一、前言 桥接模式(Bridge Pattern)是一种常用的设计模式,它可以将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式通常用于需要在多个维度上扩展一个类的情况,或…

仿京东拼多多商品分类页-(RecyclerView悬浮头部实现、xml绘制ItemDecoration)

文章目录 前言效果图思路方式一:通过xml布局来实现方式二:通过ItemDecoration方式来实现 实现步骤1、数据项格式2、左侧列表适配器3、右侧列表适配器4、头部及悬浮头部绘制4.1头部偏移高度为要绘制xml布局的高度--getItemOffsets()4.2 绘制固定头部--onD…

Node.js 框架 star 星数量排名——NestJs跃居第二

文章目录 什么是NodeJs?什么是NodeJs框架?图表数据框架排名 什么是NodeJs? Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得我们可以在服务器端使用JavaScript开发高效、可扩展的应用程序。作为一个快速、轻量级的平台,Node.js在Web开发领…

CTFhub-RCE-php://input

我们需要使用php://input来构造发送的指令 查看phpinfo&#xff0c;找到一下字段 证明是可以使用php://input 1. 使用Burpsuite抓包并转至Repeater 2. 构造包 方法&#xff1a;POST 目标&#xff1a;/?filephp://input Body&#xff1a;<?php system("ls /"…

元宇宙时代,数字员工正成为企业服务的黄金担当!

未来&#xff0c;你的同事可能不是“人” 自2021年“元宇宙”爆火之后&#xff0c;作为连接现实世界和元宇宙的媒介之一&#xff0c;虚拟人开始大量跑步入场。伴随着虚拟数字人相关技术包括CG、语音识别、图像识别、动捕等的共同成熟&#xff0c;让数字虚拟产业在今年渐入佳境…

(免费领源码)Springboot宠物医院管理系统的设计与实现84724-计算机毕业设计项目选题推荐

摘 要 现如今生活质量提高&#xff0c;人们追求精神健康&#xff0c;与家中宠物朝夕相处&#xff0c;感情深厚&#xff0c;宠物渐渐成了我们身边的朋友。因而宠物生病了&#xff0c;需要去看病&#xff0c;自古医院救死扶伤&#xff0c;生命无贵贱&#xff0c;无论人类还是动物…

一文详解进销存管理系统!

一、什么是进销存管理系统&#xff1f; 进销存软件是一种针对制造业企业设计的管理软件系统&#xff0c;旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化供应链&#xff0c;并增强企业的整体运营效…

如何使用Cpolar+Tipask,在ubuntu系统上搭建一个私人问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…

Nat. Med. | 成年人的城市生活环境对心理健康的影响

今天为大家介绍的是来自Jiayuan Xu和Gunter Schumann团队的一篇论文。城市居民暴露于许多可能相互结合和相互作用的环境因素&#xff0c;这些因素可能影响心理健康。目前尚未有工作尝试建模城市生活的复杂实际暴露与大脑和心理健康之间的关系&#xff0c;以及这如何受遗传因素调…

每日互动(个推)全新推出AITA智选人群工具,助力品牌营销升级

11月9日&#xff0c;在2023年世界互联网大会“新产品新技术特色场景发布活动”上&#xff0c;数据智能服务商每日互动&#xff08;个推&#xff09;全新打造的AITA智选人群工具首次正式对外发布。作为每日互动在品牌营销领域的大模型应用最新成果&#xff0c;AITA智选人群工具将…

【学习笔记】 - GIT的基本操作,IDEA接入GIT以及上传hub

用github蛮多&#xff0c;但git没怎么用&#xff0c;看着视频对着写点笔记以及操作 一、GIT文件的三种状态和模式 已提交(committed) 已提交表示数据已经安全的保存在本地数据库中。 已修改(modified) 已修改表示修改了文件&#xff0c;但还没保存到数据库中。…

速锐得HJ1239车载终端TBOX柴油商用车远程排放管理工况模型应用

其实排放模型&#xff0c;并不是生涩难懂的问题&#xff0c;首先我们准备好一台TBOX&#xff0c;比如无论是海康、华为、速锐得、博世、联电、LG、西门子都可以做到&#xff0c;在满足TBOX具备4G物联网2路CAN支持远程升级控车&#xff0c;支持国四国五国六车型&#xff0c;带定…

Kafka简单汇总

Kafka的结构图 多个Parttion共同组成这个topic的所有消息。每个consumer都属于一个consumer group&#xff0c;每条消息只能被consumer group中的一个Consumer消费&#xff0c; 但可以被多个consumer group消费。即组间数据是共享的&#xff0c;组内数据是竞争的。二、消费模型…

【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;时间管理、系统工具 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为「手机时间管理」APP原型&#xff0c;…

【华为OD题库-015】报文重排序-Java

题目 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓冲区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N,表示子报文的个数&#xff0c;0<N < 1000。 输入第二行为N个子报…