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

Python实现堆排序遇RecursionError:递归深度超出问题排查

堆排序递归深度超限问题排查及修复

你的代码里有好几处问题导致了RecursionError以及其他潜在错误,逐个梳理:

  • 无限递归触发栈溢出
    _max_heapify函数里,当largest == i时(当前节点已是最大值,无需交换),你没有终止递归,而是直接继续调用自身,这会导致无限递归,最终触发递归深度超限错误。必须仅在largest != i时才执行递归。

  • 变量名大小写不匹配
    Python是大小写敏感的,代码里多处混用大写I和小写i:

    • heap_sort里的_max_heapify(A,heap_size, I)
    • _build_max_heap里的_max_heapify(A,heap_size, I)
    • _left函数参数写的是I,但内部用的是i
      这些会直接引发NameError或错误的索引计算。
  • range函数使用错误

    • heap_sort里的for i in range(heap_size // 2, -1):默认步长为1时,起始值大于结束值不会生成任何循环元素。堆排序正确的遍历范围应该是从最后一个元素倒序到索引1,写法为range(heap_size-1, 0, -1)。
    • _build_max_heap里的for i in range(heap_size // 2):构建最大堆需要从最后一个非叶子节点开始倒序遍历,也就是heap_size//2 -1到0,正确写法是range(heap_size//2 -1, -1, -1)。
  • _left函数参数定义错误
    _left函数参数写的是大写I,但内部用的是小写i,会导致未定义变量错误,需将参数改为小写i。


修正后的完整代码

def heap_sort(A):
    heap_size = _build_max_heap(A)
    # 从最后一个元素倒序遍历到索引1
    for i in range(heap_size - 1, 0, -1):
        # 交换堆顶和当前最后一个元素
        A[0], A[i] = A[i], A[0]
        heap_size -= 1
        # 对新的堆顶进行堆化
        _max_heapify(A, heap_size, 0)

def _build_max_heap(A):
    heap_size = len(A)
    # 从最后一个非叶子节点倒序遍历堆化
    for i in range(heap_size // 2 - 1, -1, -1):
        _max_heapify(A, heap_size, i)
    return heap_size

def _left(i):
    return (2 * i) + 1

def _right(i):
    return (2 * i) + 2

def _max_heapify(A, heap_size, i):
    l = _left(i)
    r = _right(i)
    largest = i
    # 找左子节点和当前节点的较大值
    if l < heap_size and A[l] > A[largest]:
        largest = l
    # 找右子节点和当前最大值的较大值
    if r < heap_size and A[r] > A[largest]:
        largest = r
    # 如果最大值不是当前节点,交换后递归堆化
    if largest != i:
        A[i], A[largest] = A[largest], A[i]
        _max_heapify(A, heap_size, largest)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:16:06