交替选择排序(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)
修正逻辑说明
- 用
left和right指针维护未排序区间,每轮迭代后收缩区间 - 按轮次编号判断奇偶,完全匹配题目中“奇数轮/偶数轮”的要求
- 奇数轮将最小值放到左边界,偶数轮将最大值放到右边界,保证已排序部分的正确性
- 交换完成后打印列表,输出每轮迭代后的正确状态
内容的提问来源于stack exchange,提问作者afrodev
相关产品推荐
相关产品推荐

