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。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
