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

Python实现选择排序输出未排序 代码逻辑问题排查

选择排序实现逻辑错误排查

你的代码存在两处核心逻辑缺陷,正是这两个问题导致排序结果完全混乱:

  • 内层循环遍历范围错误:选择排序每完成一轮外层循环,数组前i位就已经是排好序的最小元素,不需要再参与后续比较。你的内层循环写的是range(len(array)),每次都从数组索引0开始全量遍历,会反复把已经放到前面有序区的小元素重新纳入比较,直接打乱已排序的部分。
  • 最小索引初始值错误:每轮外层循环开始时,你把存储最小元素下标的index硬编码为0,但实际上当前轮次要处理的是从i位置开始的未排序区间,初始最小值就是array[i],对应的初始下标应该是i。如果当前轮次未排序区间里没有比array[i]更小的元素,代码不会进入内层的if分支更新index,此时index仍然是0,就会错误地把array[i]和数组第一个位置的元素交换,直接破坏前序排序结果。

举个最直观的例子:第一轮循环i=0时,你能正确找到全局最小值0在索引10的位置,交换后0会放到数组首位,这一步是对的。但到第二轮i=1时,你的内层循环从j=0开始比较,array[0]位置的0比你初始化的smallest=array[1]=44更小,会触发更新把smallest设为0、index设为0,之后交换array[1]和array[0],直接把第一轮排好的0换到了索引1的位置,44换到了首位,排序直接失效。

修正后代码

只需要调整两处参数即可让算法正常运行:

def selection_sort(array):
    for i in range(len(array)):
        # 最小索引初始值设为当前未排序区间起点i
        index = i
        smallest = array[i]
        # 内层循环从i开始,仅遍历未排序区间
        for j in range(i, len(array)):
            if array[j] < smallest:
                smallest = array[j]
                index = j
        temp = array[i]
        array[i] = smallest
        array[index] = temp
    return array


to_sort = [99, 44, 6, 2, 1, 5, 63, 87, 283, 4, 0]
print(selection_sort(to_sort))

运行上述代码会输出正确排序结果:[0, 1, 2, 4, 5, 6, 44, 63, 87, 99, 283]


内容的提问来源于stack exchange,提问作者Faisal Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:06:26