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