SelectionSort代码输出结果异常,请求技术排查与修正指导
问题排查与修正
核心问题分析
你的代码逻辑并非标准选择排序,而是尝试实现插入排序但存在多处致命错误,导致处理[3,10,2,5]时失败:
prev_num逻辑完全错误:你用"上一个处理的元素值"判断当前元素是否直接追加到已排序列表,但实际需要将当前元素与已排序部分的所有元素比较。比如处理完2后,prev_num被设为2,后续处理5时,因5>2直接追加,忽略了5小于已排序部分最大值10的事实,导致5未被插入到正确位置。- 遍历原列表时修改列表:循环
for i in my_list中执行my_list.remove(i)和my_list.insert(index_num, i),会破坏迭代器的遍历顺序,导致元素处理错位。 - 依赖
my_list.index(i)存在隐患:若列表中有重复元素,index()会返回第一个匹配项的索引,直接导致逻辑错误。
正确的选择排序实现
选择排序的核心逻辑是:将列表分为已排序和未排序两部分,每一轮从未排序部分找到最小值,与未排序部分的第一个元素交换位置,重复直到排序完成。
def selection_sort(my_list): n = len(my_list) # 遍历每个位置,作为已排序部分的末尾 for i in range(n): # 找到未排序部分的最小元素索引 min_idx = i for j in range(i+1, n): if my_list[j] < my_list[min_idx]: min_idx = j # 将最小元素与未排序部分的第一个元素交换 my_list[i], my_list[min_idx] = my_list[min_idx], my_list[i] return my_list # 测试用例 print(selection_sort([1, 3, 4, 2, 6, 5])) # [1, 2, 3, 4, 5, 6] print(selection_sort([3, 4, 2, 6])) # [2, 3, 4, 6] print(selection_sort([3, 7, 4, 1])) # [1, 3, 4, 7] print(selection_sort([3, 10, 2, 5])) # [2, 3, 5, 10]
基于你的逻辑修正为插入排序
如果想保留你原本的插入思路,可调整为以下正确的插入排序实现:
def insertion_sort(my_list): new_list = [] for num in my_list: # 遍历已排序列表,找到正确插入位置 insert_pos = 0 while insert_pos < len(new_list) and num > new_list[insert_pos]: insert_pos += 1 new_list.insert(insert_pos, num) return new_list # 测试用例 print(insertion_sort([1, 3, 4, 2, 6, 5])) # [1, 2, 3, 4, 5, 6] print(insertion_sort([3, 4, 2, 6])) # [2, 3, 4, 6] print(insertion_sort([3, 7, 4, 1])) # [1, 3, 4, 7] print(insertion_sort([3, 10, 2, 5])) # [2, 3, 5, 10]
内容的提问来源于stack exchange,提问作者perilousranch
相关产品推荐
相关产品推荐

