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

如何通过查找子数组最大最小值实现排序?代码运行后数组无变化如何解决

问题原因

你的代码核心问题是交换最小值到左边界后,原始记录的最大值索引可能已经失效。
以你给出的测试用例为例,第一轮执行逻辑如下:

  • 初始数组为[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:06