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

交替选择排序(Selection Sort)实现错误排查求助

修改版选择排序代码的错误分析与修正

你的代码存在几个关键逻辑错误,导致排序失效,具体如下:

  • 循环起始与区间收缩逻辑错误
    你用range(1, n)作为外层循环,第一轮(奇数轮)直接从索引1开始处理,但正确逻辑应该从索引0启动第一轮,找最小值放到最左端。同时,当前外层循环没有收缩未排序区间——修改版选择排序需要交替处理左、右边界,每轮后未排序区间应向中间缩小,而非固定从i遍历到末尾。

  • 偶数轮最大值放置位置错误
    题目要求偶数轮将最大值放到“合适位置”,这里的位置应该是当前未排序部分的最右端,而非你代码中i所在的位置。把最大值交换到i的位置会打乱已排序的左半部分,导致排序混乱。

  • 打印时机与对象错误
    你在交换元素之前打印列表,且打印的是全局变量lista,正确做法应该是交换完成后打印修改后的函数参数arr,这样才能输出每轮迭代后的真实状态。

  • 奇偶轮的区间处理逻辑错误
    奇数轮应在[left, right]区间找最小值,放到left位置后左边界右移;偶数轮在同一区间找最大值,放到right位置后右边界左移,直到区间收缩完毕,而非固定用i遍历所有索引。


修正后的代码

def ordenacao_por_selecao_modificada(arr):
    n = len(arr)
    left = 0
    right = n - 1
    # 执行n-1轮迭代
    for round_num in range(1, n):
        if round_num % 2 == 1:
            # 奇数轮:找最小值放到左边界
            min_idx = left
            for j in range(left, right + 1):
                if arr[j] < arr[min_idx]:
                    min_idx = j
            arr[left], arr[min_idx] = arr[min_idx], arr[left]
            print(arr)
            left += 1
        else:
            # 偶数轮:找最大值放到右边界
            max_idx = right
            for j in range(left, right + 1):
                if arr[j] > arr[max_idx]:
                    max_idx = j
            arr[right], arr[max_idx] = arr[max_idx], arr[right]
            print(arr)
            right -= 1

lista = [8, 2, 5, 1, 10, 4]
ordenacao_por_selecao_modificada(lista)

修正逻辑说明

  1. 用left和right指针维护未排序区间,每轮迭代后收缩区间
  2. 按轮次编号判断奇偶,完全匹配题目中“奇数轮/偶数轮”的要求
  3. 奇数轮将最小值放到左边界,偶数轮将最大值放到右边界,保证已排序部分的正确性
  4. 交换完成后打印列表,输出每轮迭代后的正确状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:21:05