You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:02:21