如何通过查找子数组最大最小值实现排序?代码运行后数组无变化如何解决
问题原因
你的代码核心问题是交换最小值到左边界后,原始记录的最大值索引可能已经失效。
以你给出的测试用例为例,第一轮执行逻辑如下:
- 初始数组为
[235, 25, 123, 1],left=0,right=3 - 遍历后得到
min_index=3(对应值1),max_index=0(对应值235) - 第一步交换左边界和最小值位置的元素,数组变为
[1, 25, 123, 235] - 此时你仍然使用原始记录的
max_index=0去和右边界交换,等于把刚放到首位的1和末尾的235又换了回去,数组回到初始状态,多次递归后数组自然没有变化。
你将for循环改为range(left, right)后出现的异常,是因为遍历范围排除了右边界,无法正确识别整个子数组的最大值,自然排序结果错误。
修复方案
在交换最小值到左边界后,增加一步判断:如果最大值原本就在左边界位置,说明刚才的最小值交换已经把最大值移到了原来的min_index位置,需要更新max_index后再执行最大值交换。
修复后代码如下:
def novel_sort(arr, left, right): if left < right: min_index = left max_index = left for i in range(left, right+1): if arr[i] < arr[min_index]: min_index = i if arr[i] > arr[max_index]: max_index = i arr[left], arr[min_index] = arr[min_index], arr[left] # 修复逻辑:如果最大值原位置是左边界,更新最大值索引 if max_index == left: max_index = min_index arr[right], arr[max_index] = arr[max_index], arr[right] novel_sort(arr, left + 1, right - 1)
使用你给出的测试用例执行,输出为[1, 25, 123, 235],符合预期。
内容的提问来源于stack exchange,提问作者Fugs
相关产品推荐
相关产品推荐

