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
相关产品推荐
相关产品推荐

