当前位置: 首页 > news >正文

冒泡排序代码实现详解

Python 冒泡排序代码实现详解

冒泡排序是一种简单直观的排序算法,它通过重复遍历列表,比较相邻元素并交换位置,使较大元素逐渐"浮"到列表末尾。下面我将详细解析Python实现冒泡排序的代码。

完整代码实现

def bubble_sort(arr):"""冒泡排序算法实现参数:arr -- 待排序的列表返回:原地排序后的列表(不返回新列表)"""n = len(arr)# 外层循环:控制排序轮数(n-1轮)for i in range(n - 1):# 优化标记:记录本轮是否发生交换swapped = False# 内层循环:每轮将当前最大值"冒泡"到末尾# 注意:每轮结束后末尾元素已有序,所以范围递减for j in range(0, n - 1 - i):# 比较相邻元素if arr[j] > arr[j + 1]:# 交换元素(较大值后移)arr[j], arr[j + 1] = arr[j + 1], arr[j]swapped = True  # 标记发生交换# 优化:若本轮未交换,说明数组已有序,提前结束if not swapped:break# 返回排序后的数组(可选,因为排序是原地进行的)return arr

代码分步解析

1. 函数定义和参数

def bubble_sort(arr):n = len(arr)
  • arr: 待排序的列表

  • n: 列表长度,用于控制循环次数

2. 外层循环 - 控制排序轮数

for i in range(n - 1):
  • 外层循环控制排序的轮数

  • 对于n个元素的列表,最多需要n-1轮排序

  • 每轮排序会将当前未排序部分的最大元素"冒泡"到正确位置

3. 内层循环 - 比较和交换元素

for j in range(0, n - 1 - i):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]swapped = True
  • 内层循环遍历当前未排序部分

  • n - 1 - i: 每轮结束后末尾i个元素已有序,无需再比较

  • 比较相邻元素arr[j]arr[j+1]

  • 如果前一个元素大于后一个元素,则交换它们的位置

  • Python特有的元组交换语法:a, b = b, a,无需临时变量

4. 优化策略 - 提前终止

swapped = False
# ...内层循环...
if not swapped:break
  • swapped标记记录本轮是否发生交换

  • 如果一轮遍历中没有发生任何交换,说明列表已完全有序

  • 提前终止排序,避免不必要的循环

  • 这是冒泡排序最重要的优化,显著提升在有序或基本有序数据上的性能

执行过程可视化

以列表[5, 3, 8, 1]为例:

初始: [5, 3, 8, 1]第1轮:比较 5>3 → 交换 → [3, 5, 8, 1]比较 5<8 → 保持 → [3, 5, 8, 1]比较 8>1 → 交换 → [3, 5, 1, 8]  # 8归位swapped = True第2轮:比较 3<5 → 保持 → [3, 5, 1, 8]比较 5>1 → 交换 → [3, 1, 5, 8]  # 5归位swapped = True第3轮:比较 3>1 → 交换 → [1, 3, 5, 8]  # 3归位swapped = True最终结果: [1, 3, 5, 8]

测试代码

if __name__ == "__main__":# 测试用例test_cases = [[64, 34, 25, 12, 22, 11, 90],  # 普通情况[1, 2, 3, 4, 5],               # 已排序情况(测试优化)[5, 4, 3, 2, 1],               # 逆序情况[42],                          # 单元素情况[]                             # 空列表情况]for i, arr in enumerate(test_cases):print(f"测试用例 {i+1}: 排序前: {arr}")bubble_sort(arr)print(f"        排序后: {arr}")print("-" * 50)

测试输出

测试用例 1: 排序前: [64, 34, 25, 12, 22, 11, 90]排序后: [11, 12, 22, 25, 34, 64, 90]
--------------------------------------------------
测试用例 2: 排序前: [1, 2, 3, 4, 5]排序后: [1, 2, 3, 4, 5]
--------------------------------------------------
测试用例 3: 排序前: [5, 4, 3, 2, 1]排序后: [1, 2, 3, 4, 5]
--------------------------------------------------
测试用例 4: 排序前: [42]排序后: [42]
--------------------------------------------------
测试用例 5: 排序前: []排序后: []
--------------------------------------------------

算法特性分析

特性

描述

时间复杂度

最优 O(n),最差 O(n²),平均 O(n²)

空间复杂度

O(1)(原地排序)

稳定性

稳定(相等元素不交换)

适用场景

小规模数据或基本有序数据

时间复杂度详解

  • 最优情况​:当输入列表已经有序时,只需一轮遍历(n-1次比较)即可完成,时间复杂度为O(n)

  • 最差情况​:当输入列表完全逆序时,需要n-1轮遍历,每轮进行n-i-1次比较和交换,总操作次数为(n-1)+(n-2)+...+1 = n(n-1)/2,时间复杂度为O(n²)

  • 平均情况​:对于随机数据,时间复杂度为O(n²)

空间复杂度

  • 冒泡排序是原地排序算法,只需要常数级别的额外空间(用于交换元素和标记变量)

  • 空间复杂度为O(1)

稳定性

  • 冒泡排序是稳定的排序算法

  • 当相邻元素相等时不会交换,保持了相等元素的原始顺序

常见问题解答

Q1: 为什么需要n-1轮排序?

A: n个元素只需确定前n-1个元素的位置,最后一个元素自然有序。

Q2: 优化标记swapped有什么作用?

A: 避免对已有序数组进行无效循环。例如测试用例2中,第一轮遍历后没有发生交换,算法立即终止,节省了后续轮次的比较。

Q3: Python实现与其他语言的区别?

A: Python特有的元组交换语法a, b = b, a使代码更简洁,无需临时变量。同时Python的动态类型系统简化了实现。

Q4: 冒泡排序在实际应用中的局限性?

A: 时间复杂度O(n²)使其在大数据量时效率较低。对于超过1000个元素的列表,建议使用更高效的算法如快速排序(O(n log n))。

Q5: 如何优化冒泡排序的性能?

A: 除了使用swapped标记外,还可以:

  1. 记录最后一次交换位置,缩小下一轮比较范围

  2. 使用双向冒泡(鸡尾酒排序),交替进行正向和反向遍历

  3. 对于小规模数据,插入排序通常更高效

总结

冒泡排序虽然效率不高,但作为最基础的排序算法之一,其简单直观的实现方式非常适合教学和理解排序算法的基本原理。Python实现充分利用了语言特性,代码简洁易读。通过优化标记swapped,算法在有序或基本有序数据上可以达到接近线性的时间复杂度。在实际应用中,冒泡排序适用于小规模数据排序或作为其他高级算法的组成部分。

http://www.dtcms.com/a/524511.html

相关文章:

  • 金仓多模数据库平替MongoDB的电子证照国产化实践——从2TB数据迁移到1600+并发支撑
  • 【优先级队列(堆)】3.前 K 个⾼频单词 (medium)
  • 苏州建站公司 诚找苏州聚尚网络设计图案用什么软件
  • 数据结构——快速排序
  • IntelliJ IDEA新版下载、安装、创建项目及Maven配置的教程(附安装包等)
  • C++特性详解:extern、缺省参数、函数模板与名字空间
  • VUE+Electron从0开始搭建开发环境
  • MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地
  • 项目(一)
  • SaaS多租户架构实践:字段隔离方案(共享数据库+共享Schema)
  • 企业网站网页设计的步骤房地产网站建设需求说明书
  • 中国专门做生鲜的网站著名品牌展厅设计
  • 开发避坑指南(66):IDEA 2025 Gradle构建安全协议警告:Maven仓库HTTPS切换或允许HTTP的配置方法
  • 前端新手入门-HBuilder工具安装
  • AceContainer::Initialize()函数的分析
  • 石家庄网站建设方案咨询涉县住房与城乡建设厅网站
  • 鸿蒙Next媒体开发全攻略(ArkTS):播放、录制、查询与转码
  • vs2015网站开发基础样式福田庆三下巴
  • Hugging Face介绍
  • 要建立网站和账号违法违规行为数据库和什么黑名单企业所得税优惠税率
  • 大模型训练中的关键技术与挑战:数据采集、微调与资源优化
  • 【文献笔记】arXiv 2018 | PointSIFT
  • 如何检测和解决I2C通信死锁
  • 深度学习快速入门手册
  • 如何看待 AI 加持下的汽车智能化?带来更好体验的同时能否保证汽车安全?
  • Linux中的一些常见命令
  • 三步将AI模型转换为 DeepX 格式并完成精度评估
  • 做第一个网站什么类型天津市建筑信息平台
  • 找一个网站做优化分析app界面设计属于什么设计
  • 【开题答辩全过程】以 毕业设计选题系统的设计与实现为例,包含答辩的问题和答案