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

我的Python递归快速排序算法运行报错,问题出在哪里?

代码问题排查及修复

核心错误点

  • 第一个错误:partition函数最后交换pivot位置时写死了arr[0]
    每次递归处理的不是整个数组,是数组的某一段(比如第5位到第10位),这一段的第一个元素才是pivot,你写死arr[0]就是每次都把整个数组的第一个元素拿过来交换,完全打乱了分区结果,导致递归永远没法走到l >= h的终止条件,就会一直递归下去,最后触发超出最大递归深度的报错。
  • 第二个错误:partition内部的两个内层while循环没有加边界判断
    如果当前处理的段里所有元素都比pivot小/大,那lo +=1或者hi -=1会一直执行,跑到当前段的下标范围外面,这时候访问arr[lo]/arr[hi]就会报索引越界的错误,加边界判断就能避免这个问题。
  • 第三个优化点:不需要把数组设为全局变量,可以把数组作为参数传入函数,逻辑更清晰,也能适配不同数组的排序需求。

修复后的完整代码

def partition(arr, low, high):
    lo = low
    hi = high
    pivot = arr[lo]  # 取当前子区间第一个元素作为pivot
    while lo < hi:
        # 找左半区第一个大于pivot的元素,加边界防止越界
        while lo <= high and arr[lo] <= pivot:
            lo += 1
        # 找右半区第一个小于等于pivot的元素,加边界防止越界
        while hi >= low and arr[hi] > pivot:
            hi -= 1
        if hi > lo:
            arr[lo], arr[hi] = arr[hi], arr[lo]
    # 把pivot放到正确的分界位置,这里用当前子区间的第一个元素arr[low],不是arr[0]
    arr[low], arr[hi] = arr[hi], arr[low]
    return hi


def quicksort(arr, l, h):
    if l < h:
        j = partition(arr, l, h)
        quicksort(arr, l, j)
        quicksort(arr, j + 1, h)


# 测试代码
arr = [81, 4, 73, 1, 98, 69, 300, 14, 7, 420, 190, 8, 9]
quicksort(arr, 0, len(arr)-1)  # 用len(arr)-1自动获取最后一个下标,不用手动写12,避免数组长度变了还要改参数
print(arr)

运行结果

输出为排序完成的数组:
[1, 4, 7, 8, 9, 14, 69, 73, 81, 98, 190, 300, 420]

内容的提问来源于stack exchange,提问作者theoneandonlysiuuuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:45:02