Python冒泡排序未完全排序列表问题求助
解决你的冒泡排序部分排序问题
我来帮你定位代码里的问题,你的冒泡排序只完成了一半排序,主要是两个细节处理错了:
问题1:错误的交换标记重置逻辑
你代码里的else: isSwapped = False是核心问题。冒泡排序的isSwapped标记应该只要本轮有过一次交换,就保持为True,直到本轮结束。但你现在的逻辑是:只要当前相邻元素没交换,就把标记改成False——哪怕前面已经发生过交换。比如某一轮前面交换了几次,后面几个元素没交换,最后isSwapped会被改成False,导致循环提前终止,没跑完所有必要的排序轮次。
问题2:内层循环没有利用已排序的尾部元素
冒泡排序每完成一轮,最末尾的元素会是当前未排序部分的最大值,所以下一轮不需要再比较这些已经有序的尾部元素。你现在的内层循环每次都遍历整个列表,不仅效率低,也容易因为提前终止的问题影响排序完整性。
修正后的代码
mylist = [16, 19, 11, 15, 10, 12, 14] for j in range(len(mylist)): isSwapped = False i = 0 # 内层循环只遍历未排序的前半部分,跳过已排好的尾部j个元素 while i < len(mylist) - 1 - j: if mylist[i] > mylist[i + 1]: mylist[i], mylist[i + 1] = mylist[i + 1], mylist[i] isSwapped = True # 移除错误的else分支,只在交换时标记为True i += 1 if not isSwapped: break print(mylist)
改动说明
- 删掉了
else: isSwapped = False:现在isSwapped初始为False,只有发生交换时才设为True,本轮结束后如果还是False,说明列表已经完全有序,才会提前终止循环。 - 内层循环条件改为
i < len(mylist) - 1 - j:每轮j结束后,末尾j个元素已经有序,不需要再比较,既提升了效率,也保证了排序的完整性。
运行修正后的代码,输出会是完全有序的[10, 11, 12, 14, 15, 16, 19]。
内容的提问来源于stack exchange,提问作者pylist
相关产品推荐
相关产品推荐

