Python中如何正确打印冒泡排序过程?现有代码为何循环输出异常?
冒泡排序代码无法按预期执行的原因分析
问题背景
编写了如下Python冒泡排序代码:
lst = [6, 3, 0] keepGoing = True while keepGoing == True: for element in lst: thiselem = element if lst[lst.index(thiselem)] != lst[-1]: nextelem = lst[lst.index(thiselem) + 1] if int(thiselem) > int(nextelem): lst[lst.index(thiselem) + 1] = thiselem lst[lst.index(thiselem)] = nextelem print(lst)
实际输出是反复打印:
[0,6,3]
期望输出是打印排序的每一步,完成后停止:
[3,6,0] [3,0,6] [0,3,6]
问题原因
lst.index(thiselem)导致索引混乱index()方法只会返回第一个匹配元素的位置,当列表在交换过程中出现重复值时,它会指向错误的索引。比如列表变成[0,6,3]后,循环到元素6时,lst.index(6)确实是索引1,但交换操作会让列表回到之前的状态,直接陷入死循环,反复打印同一个结果。keepGoing状态从未更新
冒泡排序的终止条件是“某一轮循环中没有发生任何交换”,你的代码里keepGoing始终被设为True,没有在循环中根据是否发生交换修改它的状态,所以即使列表已经有序,循环还会持续执行。遍历方式错误
直接遍历列表元素再用index()找位置的方式不可靠,冒泡排序应该通过索引遍历相邻元素对,这样能精准控制每一对需要比较的元素,避免索引混乱的问题。
修正后的代码示例
lst = [6, 3, 0] keep_going = True while keep_going: keep_going = False # 默认本轮无交换,若有序则退出循环 for i in range(len(lst) - 1): if lst[i] > lst[i+1]: # 交换相邻元素 lst[i], lst[i+1] = lst[i+1], lst[i] keep_going = True # 标记本轮有交换,需继续循环 print(lst)
这段代码的输出与期望一致:
[3, 6, 0] [3, 0, 6] [0, 3, 6]
内容的提问来源于stack exchange,提问作者Bred Bredboi
相关产品推荐
相关产品推荐

