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
相关产品推荐
相关产品推荐

