为什么冒泡排序算法需要嵌套两层for循环才能完成排序?
冒泡排序双层循环的作用说明
你给出的冒泡排序代码如下:
# Bubble sort a = [2092, 8966, 564331, 989] laenge = len(a) for i in range(1,laenge): for j in range(0,laenge-i): if a[j] > a[j+1]: tempdata = a[j] a[j] = a[j+1] a[j+1] = tempdata print(a) print("Surprise monkey")
冒泡排序的核心逻辑是每一轮遍历都会把当前未排序区间里的最大元素,通过相邻交换“冒泡”到区间末尾的正确位置,两层循环分别对应这个逻辑里的两个维度:
- 外层
i循环:控制排序的轮次。长度为n的数组,最多只需要n-1轮就能完成排序,因为每一轮至少确定1个元素的最终位置,n-1轮后剩下的最后1个元素自动处于正确位置。你代码里range(1, laenge)刚好就是执行n-1轮,符合要求。 - 内层
j循环:负责每一轮里的相邻元素比较交换。因为每完成1轮排序,末尾就会多1个已经排好的最大元素,不需要再参与后续比较,所以每一轮的比较区间上限会逐轮缩小i位。代码里range(0, laenge-i)刚好匹配每一轮的未排序区间长度,且j+1不会出现数组越界问题。
我们可以用你给出的数组直观验证:
数组初始值为[2092, 8966, 564331, 989],长度为4,需要执行3轮排序:
- 第1轮(i=1):j遍历0~2,比较后最大元素
564331交换到末尾,数组变为[2092, 8966, 989, 564331] - 第2轮(i=2):j遍历0~1,不需要比较末尾已经排好的元素,比较后第二大元素
8966交换到倒数第二位,数组变为[2092, 989, 8966, 564331] - 第3轮(i=3):j只需要遍历0,比较后第三大元素
2092交换到第二位,数组变为[989, 2092, 8966, 564331],排序完成。
如果只有单层循环,你只能完成一轮排序,最多只能把1个最大元素放到正确位置,剩下的元素依然是乱序,无法得到完整的排序结果。
内容的提问来源于stack exchange,提问作者Daniel Siwy
相关产品推荐
相关产品推荐

