Python冒泡排序中swapped=False作用及else输出疑问
冒泡排序相关疑问解答
1. 为什么while循环内要先设swapped = False?
这是冒泡排序的终止条件控制逻辑,核心目的是判断列表是否已经完全有序:
- 进入循环时先把
swapped设为False,默认这一轮遍历不会有任何交换。 - 接着遍历列表的相邻元素,只要发现逆序对(前一个元素比后一个大)就交换,同时把
swapped改成True——这表示本轮有交换发生,说明列表还没完全排好序,下一轮循环需要继续执行。 - 如果整轮遍历结束后,
swapped还是False,意味着这一轮没有任何元素交换,列表已经是有序状态了,此时while循环的条件swapped为假,循环终止,排序完成。
要是直接在循环里终止while,就没办法判断列表是否真的有序,会提前停止排序,导致结果错误。
2. 为什么添加else子句后会多次输出"No swap"?
你加的else子句是绑定在if my_list[i] > my_list[i + 1]这个判断上的——只要相邻两个元素是顺序的(前小后大),就会触发else分支打印"No swap"。
冒泡排序的每一轮都会遍历列表中大部分相邻元素:
- 第一轮遍历中,8和10是顺序的,会打印一次;2和4是顺序的,又会打印一次。
- 后续轮次里,随着列表逐渐变得有序,会有越来越多的相邻元素是顺序状态,每遇到一对就会输出一次"No swap",所以最终会看到多次打印。
举个简单的例子,当列表已经完全有序后,最后一轮遍历的每一对相邻元素都会触发else分支,会连续打印len(my_list)-1次"No swap",之后循环才会终止:
# 比如完全有序的列表[2,4,6,8,10],最后一轮遍历: i=0: 2<4 → 打印No swap i=1:4<6 → 打印No swap i=2:6<8 → 打印No swap i=3:8<10 → 打印No swap
内容的提问来源于stack exchange,提问作者xChineze
相关产品推荐
相关产品推荐

