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。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…...

GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库
更好的效果,更低的价格,听起来是不是像梦呓? 限制 首先,让我们来介绍一个词:RAG。 简单来说,RAG(Retrieval-Augmented Generation,检索增强生成) 的工作原理是将大型文档…...

全国区块链职业技能大赛第十套区块链产品需求分析与方案设计
任务1-1:区块链产品需求分析与方案设计 养老保险平台中涉及到参保人、社保局、公安局、工作单位等参与方,他们需要在区块链养老保险平台中完成账户注册、身份上链、社保代缴、信息核查等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于养老保险…...

分布式Apollo配置中心搭建实战
文章目录 环境要求第一步、软件下载第二步、创建数据库参考文档 最近新项目启动,采用Apollo作为分布式的配置中心,在本地搭建huanj 实现原理图如下所示。 环境要求 Java版本要求:JDK1.8 MySql版本要求:5.6.5 Apollo版本要求&…...

Android monkey命令和monkey脚本详解
Monkey命令 monkey 是 Android 平台上一个非常有用的工具,它可以帮助开发者在设备上生成随机的用户事件流,如按键输入、触摸屏手势等,以此来测试应用的稳定性。这对于发现应用中的崩溃、异常和性能问题特别有用。 基本语法 adb shell monk…...

vue 实现对图片的某个区域点选, 并在该区域上方显示该部分内容
目录 1、通义灵码实现: 2、csdn的C知道: 3、百度comate: 1、通义灵码实现: 在 Vue 中实现对图片某个区域的点选并显示该区域属于哪一部分,通常涉及到几个关键步骤: 图片区域划分: 首先&#…...

配置文件格式 INI 快速上手
文章目录 1.简介2.语法节键值对注释大小写空白行数据类型字符串 (String)整数 (Integer)浮点数 (Float)布尔值 (Boolean)列表 (List) 3.示例4.解析参考文献 1.简介 INI 的全称是 Initialization,即为初始化文件,最早是 Windows 系统配置文件所采用的格式…...

基于WebGoat平台的SQL注入攻击
目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素(机密性、完整性、可用性&…...

SpringMvc有几个上下文
你好,我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分,其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图,深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …...

k8s部署rabbitmq集群
1 部署集群 1.1 安装 # 创建一个中间件的命名空间 kubectl create namespace middleware # 创建ConfigMap,包含RabbitMQ的配置文件内容 kubectl apply -f rabbitmq-configmap.yaml # 配置用于存储RabbitMQ数据的PersistentVolume(PV)和PersistentVolum…...

Python利用包pypinyin汉字转拼音(处理多音字)
一、汉字转拼音 在python中将汉字的拼音输出可以采用pypinyin包,一下是简单的demo示例: 默认调用pinyin方法转换时时默认时带声调的,不带声调需要添加“styleStyle.NORMAL”参数。 from pypinyin import pinyin, Styledef pinyin_transfer…...