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

冒泡排序算法详解(python code)

目录

定义

排序示例

        初始状态(未排序数组)

        第 1 轮排序(目标:将最大元素 “冒泡” 到索引 5)

        第 2 轮排序(目标:将次大元素 “冒泡” 到索引 4)

        第 3 轮排序(目标:将第三大元素 “冒泡” 到索引 3)

        第 4 轮排序(验证是否有序)

        最终排序结果

python代码


定义

        冒泡排序是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。这个过程就像水中的气泡不断上浮一样,所以被称为冒泡排序。

排序示例

        以数组 [5, 2, 9, 12, 3, 8] 为例

        数组长度为 n=6,理论最多需 n-1=5 轮排序(实际优化后可能更少),每轮对比次数逐轮减少(第 1 轮对比 5 次,第 2 轮对比 4 次,…,第 k 轮对比 6-k 次)。

        初始状态(未排序数组)
索引012345
元素5291238
说明初始未排序区间:[0,5](全部元素)
        第 1 轮排序(目标:将最大元素 “冒泡” 到索引 5)
  • 对比顺序:(0,1) → (1,2) → (2,3) → (3,4) → (4,5),共 5 次对比。
  1. 对比索引 0 和 1:5 > 2 → 交换 → 数组变为 [2, 5, 9, 12, 3, 8]
  2. 对比索引 1 和 2:5 < 9 → 不交换 → 数组保持 [2, 5, 9, 12, 3, 8]
  3. 对比索引 2 和 3:9 < 12 → 不交换 → 数组保持 [2, 5, 9, 12, 3, 8]
  4. 对比索引 3 和 4:12 > 3 → 交换 → 数组变为 [2, 5, 9, 3, 12, 8]
  5. 对比索引 4 和 5:12 > 8 → 交换 → 数组变为 [2, 5, 9, 3, 8, 12]
  • 第 1 轮结果:最大元素 12 已排至索引 5(固定,后续不参与对比)。
    未排序区间变为 [0,4],数组当前状态:
    索引012345(已固定)
    元素2593812
        第 2 轮排序(目标:将次大元素 “冒泡” 到索引 4)
  • 对比顺序:(0,1) → (1,2) → (2,3) → (3,4),共 4 次对比(无需对比索引 4 和 5)。
  1. 对比索引 0 和 1:2 < 5 → 不交换 → 数组保持 [2, 5, 9, 3, 8, 12]
  2. 对比索引 1 和 2:5 < 9 → 不交换 → 数组保持 [2, 5, 9, 3, 8, 12]
  3. 对比索引 2 和 3:9 > 3 → 交换 → 数组变为 [2, 5, 3, 9, 8, 12]
  4. 对比索引 3 和 4:9 > 8 → 交换 → 数组变为 [2, 5, 3, 8, 9, 12]
  • 第 2 轮结果:次大元素 9 已排至索引 4(固定)。
    未排序区间变为 [0,3],数组当前状态:
    索引01234(已固定)5(已固定)
    元素2538912
        第 3 轮排序(目标:将第三大元素 “冒泡” 到索引 3)
  • 对比顺序:(0,1) → (1,2) → (2,3),共 3 次对比。
  1. 对比索引 0 和 1:2 < 5 → 不交换 → 数组保持 [2, 5, 3, 8, 9, 12]
  2. 对比索引 1 和 2:5 > 3 → 交换 → 数组变为 [2, 3, 5, 8, 9, 12]
  3. 对比索引 2 和 3:5 < 8 → 不交换 → 数组保持 [2, 3, 5, 8, 9, 12]
  • 第 3 轮结果:第三大元素 8 已排至索引 3(固定)。
    未排序区间变为 [0,2],数组当前状态:
    索引0123(已固定)4(已固定)5(已固定)
    元素2358912
        第 4 轮排序(验证是否有序)
  • 对比顺序:(0,1) → (1,2),共 2 次对比。
  1. 对比索引 0 和 1:2 < 3 → 不交换
  2. 对比索引 1 和 2:3 < 5 → 不交换
  • 第 4 轮结果:未发生任何交换,说明数组 [2, 3, 5, 8, 9, 12] 已完全有序,可提前终止排序(无需进行第 5 轮)。
        最终排序结果
索引012345
元素2358912

python代码

def bubble_sort(numbers: list[int]):stop_position = len(numbers) - 1  # 冒泡排序停止轮次is_swap = False                   # 是否产生交换,若无交换数据,则停止循环loop_time = 0                     # 循环次数while stop_position > 0:for i in range(stop_position):is_swap = Falsepre_num, next_num = numbers[i], numbers[i + 1]if pre_num > next_num:is_swap = Trueloop_time += 1numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]if is_swap:               # 判断是否有数据交换,若无,停止循环print(f'第{loop_time}轮冒泡排序后结果:' + str(numbers))breakstop_position -= 1print(numbers)return numbersif __name__ == '__main__':tmp_list = [5, 2, 9, 12, 3, 8]bubble_sort(tmp_list)

  执行结果

第1轮冒泡排序后结果:[2, 5, 9, 12, 3, 8]
第2轮冒泡排序后结果:[2, 5, 9, 3, 12, 8]
第3轮冒泡排序后结果:[2, 5, 3, 9, 12, 8]
第4轮冒泡排序后结果:[2, 3, 5, 9, 12, 8]
[2, 3, 5, 9, 12, 8]

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

相关文章:

  • Python训练营打卡 DAY 50 预训练模型+CBAM模块
  • Shell 编程基础与实践要点梳理
  • PCIe 5.0 SSD连续读写缓存用完速度会骤降吗?
  • IntelliJ IDEA 反编译JAR包记录
  • Beats与Elasticsearch高效数据采集指南
  • Komo Searc-AI驱动的搜索引擎
  • 控制系统仿真之PID校正1-系统固有属性(四)
  • 【ai编辑器】使用cursor-vip获得cursor的pro版 pro plan(mac)
  • 【C语言16天强化训练】从基础入门到进阶:Day 13
  • 模拟实现Linux中的进度条
  • 带动态条件的模糊查询SQL
  • 【Linux基础知识系列:第一百一十四篇】使用lsof查看打开的文件
  • frp 一个高性能的反向代理服务
  • VMware + Ubuntu 桥接模式不能联网 的常见原因、排查思路和解决步骤
  • element-plus的el-scrollbar显示横向滚动条
  • 整体设计 修订 之1 三“先”之“基” 与范畴重构:康德先验哲学的批判性程序化实现
  • 电商高并发稳赢指南:ZKmall开源商城微服务架构的实战拆解
  • AI视觉重塑汽车质检,四大车间全景解析
  • Android15 GKI版本分析Kernel Crash问题
  • 金属超声波风速风向多参数一体传感器
  • NFT:Web3数字新资产
  • k230 使用摄像头将拍照的RGB565格式图片,保存为jpg图片文件到板载TF存储卡中
  • flutter 中 的 关键字
  • flutter Function和自定义的Callback有什么区别?
  • flutter 高斯模糊闪烁问题
  • Spring AI Alibaba开发实战:从入门到高级应用
  • C# 模式匹配(Pattern Matching)
  • ASP4644四通道集成方案在射频通信系统中的可行性分析
  • Cesium入门教程(一):Cesium简介
  • PDFMathTranslate:让科学PDF翻译不再难——技术原理与实践指南