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

如何找到MergeSort算法最坏情况排列 修复对应Python代码递归内存错误

问题修复与优化方案

现有代码核心错误

  • 语法错误:join函数末尾残留了enter code here无效字符,会直接触发语法报错
  • 索引逻辑错误:split、join函数没有针对当前处理的子数组区间[l, r]做偏移,全量使用数组起始索引,导致递归过程中数组访问越界、递归深度无限增加,最终触发递归错误、内存溢出
  • 拆分逻辑错误:split函数中i*2的取值逻辑没有适配子数组偏移,不符合归并最坏排列的生成规则,正确逻辑是将有序数组的元素交替分配到左、右子数组,保证归并时每次都需要做元素比较

修复后可运行的实现

def join(A, left, right, l):
    # 合并左右子数组到原数组的l起始位置
    i = 0
    # 先填左子数组
    while i < len(left):
        A[l + i] = left[i]
        i += 1
    # 再填右子数组
    j = 0
    while j < len(right):
        A[l + i] = right[j]
        i += 1
        j += 1

def split(A, left, right, l, r):
    # 交替拆分当前子数组[l, r]的元素到左右数组
    for i in range(len(left)):
        left[i] = A[l + 2*i]
    for i in range(len(right)):
        right[i] = A[l + 2*i + 1]

def generateWorstCase(A, l, r):
    if r - l <= 0:
        return
    mid = (l + r) // 2
    left = [0]*(mid - l + 1)
    right = [0]*(r - mid)
    split(A, left, right, l, r)
    generateWorstCase(left, 0, len(left)-1)
    generateWorstCase(right, 0, len(right)-1)
    join(A, left, right, l)

# 测试用例
arr = [1, 2, 3, 4, 5, 6, 7, 8]
generateWorstCase(arr, 0, len(arr)-1)
print(arr) # 输出 [1, 5, 3, 7, 2, 6, 4, 8] 即为符合要求的最坏排列

额外优化建议

  • 避免重复创建数组:可以提前开辟全局的临时数组空间,递归过程中复用,减少频繁申请释放内存的开销,处理大数组时性能提升明显
  • 非递归实现:如果需要处理长度超过Python默认递归深度(默认1000)的数组,可以把递归实现改写成迭代版本,彻底避免递归深度限制问题
  • 边界适配:如果输入数组长度不是2的整数次幂,可添加边界判断逻辑,适配任意长度数组的最坏排列生成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:45:03