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

JS快速排序出现Maximum call stack size exceeded错误求助

解决快速排序中"Maximum call stack size exceeded"错误

你的代码出现栈溢出错误,核心原因是递归逻辑错误导致无限递归,下面拆解具体问题:

1. partion函数的致命问题

  • 循环里硬编码用了全局变量x.length,而非传入的当前处理数组区间的长度,导致每次分区都处理整个原数组,完全没用到递归传入的low和high参数
  • pivot选择错误:应该用当前区间的末尾high位置的元素,而非array.length-1,递归处理子区间时,原数组末尾元素根本不在当前子区间里
  • 多余的else if (array[i] > array[pivot])分支:循环本身已经在让j自增,这里再j+=1会跳过元素,且该判断逻辑完全错误,会打乱分区流程

2. quick_sort函数的问题

  • 调用quick_sort(x, 0, x.length)时,high传成了数组长度,但数组索引从0开始,正确的high应该是x.length-1
  • partion函数未接收low和high参数,导致递归时无法正确划分出子区间,每次递归都在处理整个数组,最终触发无限递归,栈被撑爆

修正后的代码

const x = [10, 9, 20, 3, 2, 4, 50, 69, 11, 5];

// 修正分区函数,接收low和high参数,处理指定区间
function partition(array, low, high) {
    let pivot = array[high]; // 用当前区间末尾元素做基准
    let i = low - 1; // 小于基准的元素的最后位置
    for (let j = low; j < high; j++) {
        // 如果当前元素小于基准,交换到左侧
        if (array[j] < pivot) {
            i++;
            [array[i], array[j]] = [array[j], array[i]]; // 用解构赋值简化交换
        }
    }
    // 把基准元素放到正确的位置
    i++;
    [array[i], array[high]] = [array[high], array[i]];
    return i;
}

function quick_sort(array, low, high) {
    if (low < high) {
        let pi = partition(array, low, high);
        // 递归处理左右子区间
        quick_sort(array, low, pi - 1);
        quick_sort(array, pi + 1, high);
    }
}

// 调用时传入正确的high值
quick_sort(x, 0, x.length - 1);
console.log(x); // 输出:[2, 3, 4, 5, 9, 10, 11, 20, 50, 69]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:16:09