Python算法基础:解锁冒泡排序与选择排序的奥秘
在数据处理和算法设计中,排序是一项基础且重要的操作。本文将介绍两种经典的排序算法:冒泡排序(Bubble Sort)和选择排序(Selection Sort)。我们将通过示例代码来演示这两种算法如何对列表进行升序排列。
一. 冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历待排序的列表,比较相邻的元素,并将顺序错误的元素进行交换。这个过程会一直进行,直到没有需要交换的元素为止。
分析
冒泡排序是一种简单的排序算法,主要思想是通过重复遍历待排序的列表,比较相邻的元素并根据顺序交换它们。每次遍历后,未排序部分的最大元素会“冒泡”到列表的末尾。因此,算法得名为“冒泡排序”。
我们先拿到需要排序的列表" [ 10, 50 , 20, 60, 40, 30] " ,我们知道冒泡排序实现的原理以后,可以自己在脑海里模拟计算机进行遍历排序:
首先,第一轮:我们先拿数列第一个数据和第二个数据比较,如果第二个数
比第一个数大,就交换两个数据的位置。然后,然后比较第二个数与第三个
数,一直到比较完整个数列,这时候,数列最小的数就已经排在最后面了,于
是后面每轮就不需要再与最后一个数据比较了。
然后后面每一轮都和第一轮一样,只不过每轮结束下一轮都可以少比较一个数据。
我们需要比较的列表是[ 10, 50, 20, 60, 40, 30],那么我们每轮结束以后
够可以得到一个列表。
然后,让我们模拟一下,每一轮结束得到的列表应该是什么样的:
第一轮: [50, 20, 60, 40, 30, 10]
第二轮: [50, 60, 40, 30, 20, 10]
第三轮: [60, 50, 40, 30, 20, 10] # 注意,这里我们都可以看到,其实数组的排序其实已经完成了,
第四轮: [60, 50, 40, 30, 20, 10] # 但是计算机不是人类,它只会按照程序运行,继续比较。
第五轮: [60, 50, 40, 30, 20, 10]
冒泡排序的实现
以下是使用 Python 实现的冒泡排序代码,排序列表 " [10, 50, 20, 60, 40, 30] ":
# 冒泡排序 降序,升序将"<"改成">"
l0 = [10, 50, 20, 60, 40, 30]
total = 0
count = 0for i in range(len(l0) - 1):for j in range(len(l0) - i - 1):total += 1 # 统计比较次数if l0[j] < l0[j + 1]: # 升序排序条件count += 1 # 统计交换次数temp = l0[j] # 交换元素l0[j] = l0[j + 1]l0[j + 1] = tempprint(f"第{i + 1}轮:{l0}")print(f"比较了{total}次,数值互换了{count}次", l0)
运行结果
运行上述代码后,输出结果如下:
第一轮: [50, 20, 60, 40, 30, 10]
第二轮: [50, 60, 40, 30, 20, 10]
第三轮: [60, 50, 40, 30, 20, 10]
第四轮: [60, 50, 40, 30, 20, 10]
第五轮: [60, 50, 40, 30, 20, 10]
比较了15次,数值互换了9次 [60, 50, 40, 30, 20, 10]

在这个例子中,我们可以看到最终的排序结果是 " [10, 20, 30, 40, 50, 60] "。在排序过程中,总共进行了 15 次比较,其中 9 次进行了值的交换。
二. 选择排序
选择排序是一种不稳定的排序算法,它的基本思想是每一趟从未排序的部分中选择最小(或最大)的元素,放到已排序序列的末尾,直到所有元素都排好序。这种方法的时间复杂度为 O(n^2)。
分析
选择排序是一种简单的排序算法。它的基本思想是每次从未排序的部分中选择最小(或最大)的元素,将其放到已排序部分的末尾。
我们先拿到需要排序的列表" [ 10, 50 , 20, 60, 40, 30] " ,我们知道选择排序实现的原理以后,就像冒泡排序一样在脑海里模拟计算机进行遍历排序:
首先,我们定义一个循环外的变量"max_index"把它当作每轮未排序最大数值的索引第一轮:我们先把数列第一个数据当作最大值把它的索引赋予"max_index",
然后比较l0[max_index]和第二个数据,如果第二个数比第一个数大,就把
第二个数的索引赋予max_index。然后,l0[max_index]与第三个数比较,
一直到比较完整个数列,这时候max_index就是数组最大数值的索引,交换
数列中第一个数值与最大数值的位置。然后后面每一轮都和第一轮一样,只不过每轮结束下一轮都可以少比较一个数据。
我们需要比较的列表是[ 10, 50, 20, 60, 40, 30],那么我们每轮结束以后就
可以得到一个列表。
然后,让我们模拟一下,每一轮结束得到的列表应该是什么样的:
第1轮:[60, 50, 20, 10, 40, 30]
第2轮:[60, 50, 20, 10, 40, 30]
第3轮:[60, 50, 40, 10, 20, 30]
第4轮:[60, 50, 40, 30, 20, 10]
第5轮:[60, 50, 40, 30, 20, 10]
选择排序的实现
以下是使用 Python 实现的选择排序代码,对列表 " [60, 10, 20, 50, 40, 30] " 进行降序排序:
# 选择排序 降序, 升序将"<"改成">"
l0 = [10, 50, 20, 60, 40, 30]
total = 0
count = 0for i in range(len(l0) - 1):max_index = i # 假设未排序部分的第一个元素为最大值for j in range(i + 1, len(l0)):total += 1 # 记录比较次数if l0[max_index] < l0[j]: # 寻找最大值max_index = jcount += 1 # 记录交换次数# 交换当前元素和找到的最大元素temp = l0[i]l0[i] = l0[max_index]l0[max_index] = tempprint(f"第{i + 1}轮:{l0}")print(f"比较了{total}次, 数值互换了{count}次", l0)
运行结果
运行上述选择排序的代码后,输出结果如下:
第1轮:[60, 50, 20, 10, 40, 30]
第2轮:[60, 50, 20, 10, 40, 30]
第3轮:[60, 50, 40, 10, 20, 30]
第4轮:[60, 50, 40, 30, 20, 10]
第5轮:[60, 50, 40, 30, 20, 10]
比较了15次,数值互换了5次 [60, 50, 40, 30, 20, 10]

在这个例子中,最终的排序结果是 " [60, 50, 40, 30, 20, 10] "。在排序过程中,总共进行了 15 次比较,一共进行了5次值的交换。
三. 冒泡排序与选择排序比较
性能分析
时间复杂度:
冒泡排序的时间复杂度为 O(n²),最坏和平均情况下都是 O(n²),最佳情况下(列表已排序)为 O(n)。
选择排序的时间复杂度也是 O(n²),无论是最坏、平均还是最佳情况都是 O(n²)。
选择排序:
比较次数:在每一轮中,选择排序需要遍历未排序的部分以找到最大值(或最小值)。对于长度为 (n) 的列表,第一轮需要比较 (n-1) 次,第二轮需要比较 (n-2) 次,以此类推。因此,总的比较次数为:O(n^2)
交换次数:每一轮最多只进行一次交换,因此交换次数为 (O(n))。
冒泡排序:
比较次数:在每一轮中,冒泡排序需要比较相邻的元素。对于长度为 (n) 的列表,第一轮需要比较 (n-1) 次,第二轮需要比较 (n-2) 次,以此类推。总的比较次数同样为:O(n^2)
交换次数:在最坏的情况下,每一次比较都需要进行交换,因此交换次数也是 (O(n^2))。
空间复杂度:
冒泡排序是原地排序算法,空间复杂度为 O(1)。
选择排序同样是原地排序算法,空间复杂度也为 O(1)。
使用场景
冒泡排序:
1.因为其简单易懂,适合教育和教学的场景,帮助初学者理解排序的基本概念。
2.不适合处理大型数据集,效率较低。
选择排序:
1.选择排序虽然也不适合处理大型数据集,但在某些特定情况下(例如数据基本有序时),它可能会表现得比冒泡排序更好。
2.适合对小型数据集进行排序,且实现简单。
四. 总结
通过本文的介绍,我们了解了冒泡排序和选择排序这两种经典的排序算法。虽然它们在实际应用中并不常用(因为有更高效的排序算法,如快速排序和归并排序),但它们在学习算法的过程中提供了良好的基础。
代码复用在实际开发中,使用内置的排序函数会更加高效。例如,Python 提供了内置的 ' sort() ' 方法和 ' sorted() ' 函数,使用起来简单且效率高。
示例如下:
# 使用 Python 内置的排序
l0 = [10, 50, 20, 60, 40, 30]
l0.sort() # 原地排序
print(l0) # 输出:[10, 20, 30, 40, 50, 60]l1 = [60, 10, 20, 50, 40, 30]
sorted_l1 = sorted(l1) # 返回新排序的列表
print(sorted_l1) # 输出:[10, 20, 30, 40, 50, 60]
希望本文能够帮助你理解冒泡排序和选择排序的基本概念及其实现。如果你有任何问题,欢迎在评论区讨论!
相关文章:
Python算法基础:解锁冒泡排序与选择排序的奥秘
在数据处理和算法设计中,排序是一项基础且重要的操作。本文将介绍两种经典的排序算法:冒泡排序(Bubble Sort)和选择排序(Selection Sort)。我们将通过示例代码来演示这两种算法如何对列表进行升序排列。 一…...
QtCMake工程提升类后找不到头文件
链接: QtCMake工程提升类后找不到头文件_qt提升类找不到头文件-CSDN博客 重点: 1.原因:出现问题的原因是Qt creator通过ui文件生成的程序和存放头文件的目录不在一起,但是生成的程序里会在生成目录下找头文件,所以肯…...
Docker核心技术:Docker原理之Cgroups
云原生学习路线导航页(持续更新中) 本文是 Docker核心技术 系列文章:Docker原理之Cgroups,其他文章快捷链接如下: 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术:…...
union的特性和大小端
一、union在c和c语言中的特性 1.共享内存空间:union的所有成员共享同一块内存空间。意味着在同一时刻,union 只能存储其成员 中的一个值。当你修改了union中的一个成员,那么其它成员的值也会被改变,因为它们实际上都是指向同一块…...
个性化IT服务探索实践
探索和实践个性化IT服务,可以为用户提供更优质、定制化的解决方案,从而提升用户体验和满意度。以下是一些具体的步骤和建议,帮助自己在未来探索和实践个性化IT服务。 一、了解用户需求 用户调研和反馈: 进行用户调研,了解用户的需求和痛点。收集用户反馈,通过问卷、采访…...
UE4-打包游戏,游戏模式,默认关卡
一.打包游戏 注意windows系统无法打包苹果系统的执行包,只能使用苹果系统打包。 打包完之后是一个.exe文件。 打包要点: 1.确定好要操控的角色和生成位置。 2.设置默认加载的关卡和游戏模式。 在这个界面可以配置游戏的默认地图和游戏的模式,…...
Unity ShaderLab基础
[原文1] [参考2] 一 基础知识 1. 1 着色器语言分类: 语言说明HLSL基于 OpenGL 的 OpenGL Shading LanguageGLSL基于 DirectX 的 High Level Shading LanguageCGNVIDIA 公司的 C for GraphicShader LabUnity封装了CG,HLSL,GLSL的Unity专用着色器语言,具有跨平台,图形化编程,便…...
用代理IP会频繁掉线是什么原因?HTTP和SOCKS5协议优劣势是什么?
在使用代理IP的过程中,频繁掉线是一个常见且令人头痛的问题。要解决这一问题,我们需要先了解其原因,然后比较HTTP和SOCKS5两种代理协议的优劣势,以选择最适合的解决方案。 一、代理IP频繁掉线的原因 1. 代理服务器稳定性 代理服…...
MongoDB教程(十三):MongoDB覆盖索引
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言什么是覆盖…...
快速认识EA(Enterprise Architecture)
前言 企业架构,英文是:Enterprise Architecture,简称:EA,是承接企业战略规划与IT建设之间的桥梁,是企业信息化的核心,主要包括业务架构和IT架构。 架构的本质是管理和解决系统的复杂性&#x…...
词云图制作
词云图制作 一、什么是词云 这就是词云。 “词云”的概念最早是美国西北大学新闻学副教授、新媒体专业主任里奇•戈登( Rich Gordon )提出的。词云( Word Cloud ),又称文字云、标签云( Tag Cloud &#x…...
AndroidStudio与手机进行无线调试
(一)、前提条件 一部手机一条USB数据线一部电脑手机和电脑连接到同一个 Wifi开启手机的USB调试功能开启手机的无线调试功能 (二)、操作步骤 1、 将手机和电脑用USB数据线连接 2、 打开 终端,输入 adb devices ,查看手机和电脑是否连接成功。如下图: 2、…...
脉冲编码调制(PCM,Pulse Code Modulation)简介
脉冲编码调制(PCM,Pulse Code Modulation) 脉冲编码调制(PCM,Pulse Code Modulation)是一种将模拟信号转换为数字信号的技术。在音频处理、电话通信以及其他许多领域都有广泛应用。PCM通过采样、量化、编码等三个主要步骤将模拟信号转换为数…...
Pytorch transforms 的研究
绝对路径与相对路径差别 transforms的使用 from torchvision import transforms from PIL import Imageimg_path "dataset/train/bees/16838648_415acd9e3f.jpg" img Image.open(img_path) tensor_trans transforms.ToTensor() tensor_img tensor_trans(img) prin…...
一个C++模板工厂的编译问题的解决。针对第三方库的构造函数以及追加了的对象构造函数。牵扯到重载、特化等
一窥模板的替换和匹配方式:偏特化的参数比泛化版本的还要多:判断是不是std::pair<,>。_stdpair模板参数太多-CSDN博客 简介 在一个项目里,调用了第三封的库,这个库里面有个类用的很多,而且其构…...
《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》
《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》 活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 Pix2Pix模型概述 Pix2Pix是一种基于条件生成对抗网络(cGAN)的图像转换模型&#x…...
关于c#的简单应用三题
#region 输入一个正整数,求1~这个数的阶乘 public static void Factorial(int a) { int result 1; for (int i 1; i < a; i) { result result * i; } Console.WriteLine(result); } #endregion #region 一个游戏&#…...
(十三)Spring教程——依赖注入之工厂方法注入
1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式,它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能,并以透明的方式开放给开发者,所以很少需要手工编写基于工厂方法的类。正是因为工厂…...
Redission中的Lua脚本写法、理解
对于Redission看门狗机制中的为了保证原子性的Lua脚本的写法规则是什么样的呢 ? 对于源码中的Lua脚本又是什么意思? 我们一起来看一下 首先,我们先基本的熟悉一下lua脚本的逻辑 在Lua脚本中,if (…) then … end 语句的执行过程…...
视频共享融合赋能平台LntonCVS视频监控管理平台视频云解决方案
LntonCVS是基于国家标准GB28181协议开发的视频监控与云服务平台,支持多设备同时接入。该平台能够处理和分发多种视频流格式,包括RTSP、RTMP、FLV、HLS和WebRTC。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…...
告别向日葵和TeamViewer!用你家路由器自带的DDNS功能,免费搭建Windows远程桌面(保姆级教程)
告别第三方远程工具:用路由器DDNS解锁Windows远程桌面全速体验 每次打开向日葵或TeamViewer时,那个转圈加载的进度条是否让你眉头紧锁?当免费版突然弹出"会话时长已达上限"的提示时,是否恨不得砸键盘?作为常…...
计算机毕业设计springboot校园互助平台 基于SpringBoot的高校学生互助服务系统 SpringBoot框架下的校园协同帮助平台
计算机毕业设计springboot校园互助平台3m6f99 (配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享近年来,随着互联网技术的蓬勃发展和智慧校园建设的深入推进,高校学生对于便…...
如何快速实现Blade框架国际化:多语言和本地化的完整指南
如何快速实现Blade框架国际化:多语言和本地化的完整指南 【免费下载链接】blade :rocket: Lightning fast and elegant mvc framework for Java8 项目地址: https://gitcode.com/gh_mirrors/bl/blade Blade是一款基于Java8的轻量级MVC框架,以其闪…...
JPEXS Free Flash Decompiler与Web3.0存储:去中心化SWF文件管理的终极指南
JPEXS Free Flash Decompiler与Web3.0存储:去中心化SWF文件管理的终极指南 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler JPEXS Free Flash Decompiler是一款功能强大的开源…...
手把手教你解决Unity视频播放问题:H264编码设置与RawImage的正确用法
Unity视频播放全攻略:H264编码优化与RawImage实战解析 在Unity项目开发中,视频播放功能看似简单,却暗藏诸多技术细节。许多开发者都曾遇到过视频不同步、颜色失真或性能低下的困扰。本文将深入剖析视频播放的核心技术要点,从编码格…...
Rock3A开发板实战:OpenBMC移植全记录(附避坑指南)
Rock3A开发板OpenBMC移植实战:从硬件适配到性能调优 当RK3568处理器遇上OpenBMC,会碰撞出怎样的火花?作为瑞芯微旗下性能与功耗平衡的明星芯片,RK3568在边缘计算领域已证明其价值。而将其应用于BMC(基板管理控制器&…...
MongoDB开发者必备:Dbeaver旗舰版的地理空间数据操作全攻略
MongoDB开发者必备:Dbeaver旗舰版的地理空间数据操作全攻略 在位置服务(LBS)应用爆发的时代,地理空间数据处理能力已成为开发者核心技能。无论是共享经济中的车辆调度,还是电商平台的附近推荐,精准的地理查询直接影响用户体验。作…...
深入解析WIFI中EAP-TLS认证流程与安全机制
1. EAP-TLS认证:WIFI安全连接的基石 每次我们用手机连接公司或学校的WIFI时,系统总会弹出一个证书确认的窗口,这就是EAP-TLS在发挥作用。作为目前最安全的WIFI认证协议之一,它就像网络世界的"护照查验系统",…...
GlitchTip:开源错误追踪平台完全指南:Sentry替代方案的完整教程
GlitchTip:开源错误追踪平台完全指南:Sentry替代方案的完整教程 背景 在应用开发和运维过程中,错误追踪是保障服务质量的关键环节。Sentry 作为业界领先的错误追踪服务,提供了强大的错误收集和分析能力,但其云服务版…...
Revolut警告支持高耗能AI和加密货币业务可能面临声誉风险
英国银行应用Revolut表示,由于支持加密货币和AI等高耗能行业,公司可能面临声誉风险,同时该公司公布去年利润增长57%。这家金融科技公司在等待监管批准五年后,现在终于可以作为正式的英国银行启动业务。Revolut在其2025年年报中警告…...
