当前位置: 首页 > 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.xdnf.cn/news/1378855.html

相关文章:

  • Two Knights (数学)
  • 大模型微调示例三之Llama-Factory_Lora
  • 【C++详解】用哈希表封装实现myunordered_map和 myunordered_set
  • Kubernetes一Prometheus概述
  • [linux仓库]透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • [调试][实现][原理]用Golang实现建议断点调试器
  • 获取小红书某个用户列表
  • 【LeetCode 热题 100】32. 最长有效括号——(解法二)动态规划
  • 集成电路学习:什么是TensorFlow
  • AI实时故障诊断系统(实时采集信号)
  • Python 正则表达式完全指南:从基础语法到实战案例
  • 【从0带做】基于Springboot3+Vue3的呱呱同城(微服务项目)
  • 实现微信小程序的UniApp相机组件:拍照、录像与双指缩放
  • ARM相关的基础概念和寄存器
  • PCIe 5.0 SSD连续读写缓存用完速度会骤降吗?
  • 2024年09月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 帕累托优化:多目标决策的智慧与艺术
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • 关于virtual camera
  • 【C++游记】模板升级
  • 【半导体制造流程概述】
  • windows 子系统 wsl 命令的用法
  • vue3 字符 居中显示
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 关于DTO、DO、BO、VO
  • 工业 DCS 全面科普:从入门到 AI 赋能的未来
  • mybatis-plus实现苍穹外卖项目-分类操作,不定期更新-day2
  • 【和春笋一起学C++】(三十七)类的析构函数
  • 死锁产生的条件是什么? 如何进行死锁诊断?
  • leetcode 974 和可被K整除的子数组