为何两段Python冒泡排序代码的排序顺序相反?
问题原因分析
两个代码的核心差异在于内层循环的遍历范围,这直接导致了排序结果的不同:
1. range实现的升序逻辑
内层循环用range(i+1, len(a)),限定j始终从i的下一个索引开始,只和i之后的未排序元素比较交换:
- 每次外层循环固定i时,只会把a[i]和它后面的元素对比,把更小的元素逐步换到i的位置
- 相当于把未排序部分的最小值依次放到当前i的位置,最终得到升序数组
代码示例:
""" program to implement bubble sort """ a = [9,1,5,3,7,4,2,6,8] for i in range(len(a)): for j in range(i+1, len(a)): if a[i] > a[j]: a[i], a[j] = a[j], a[i] print(a) # 输出: [1,2,3,4,5,6,7,8,9]
2. enumerate实现的降序逻辑
内层循环用enumerate(a)遍历了所有索引j(从0到数组末尾),包括j < i的已排序部分:
- 当外层循环到i时,内层循环会让a[i]和整个数组的所有元素对比,只要a[i] > a[j]就交换
- 这会导致每次外层循环结束后,a[i]的位置最终被替换成当前数组的最大值(因为只要遇到比它小的元素就交换,最大的元素会被逐步换到i的位置)
- 外层循环从0到末尾执行,最大值依次被放到0、1、2...的位置,最终得到降序数组
代码示例:
""" program to implement bubble sort """ a = [9,1,5,3,7,4,2,6,8] for i, x in enumerate(a): for j, y in enumerate(a): if a[i] > a[j]: a[i], a[j] = a[j], a[i] print(a) # 输出: [9,8,7,6,5,4,3,2,1]
修正enumerate版本的方法
如果想用enumerate实现升序冒泡排序,需要限制内层循环的j从i+1开始,和range版本保持一致:
""" program to implement bubble sort with enumerate """ a = [9,1,5,3,7,4,2,6,8] for i, x in enumerate(a): # 内层循环从i+1的索引开始遍历,指定start参数保证索引正确 for j, y in enumerate(a[i+1:], start=i+1): if a[i] > a[j]: a[i], a[j] = a[j], a[i] print(a) # 输出: [1,2,3,4,5,6,7,8,9]
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

