JavaScript快速排序算法出现无限循环,求排查原因
问题原因分析
这段代码触发无限递归(表现为无限循环直至栈溢出)的核心问题是循环起始索引错误:
- 你选取了
arr[0]作为基准值pivot,但循环却从i=0开始遍历整个数组。当i=0时,arr[i]就是pivot本身,会被放入highterThanPivot数组中。 - 每次递归处理
highterThanPivot时,这个数组里始终包含基准值pivot,导致递归永远无法触达arr.length < 2的终止条件。比如输入[2,2],第一次递归后highterThanPivot还是[2,2],下一次递归又会重复同样的操作,无限循环下去。
修正后的代码
只需要把循环的起始索引从0改成1,跳过基准值本身即可:
const quickSort = function (arr) { if (arr.length < 2) { return arr; } const pivot = arr[0]; const smallerThanPivot = []; const highterThanPivot = []; // 从i=1开始,跳过基准值 for (let i = 1; i < arr.length; i++) { if (arr[i] < pivot) { smallerThanPivot.push(arr[i]); } else { highterThanPivot.push(arr[i]); } } return [ ...quickSort(smallerThanPivot), pivot, ...quickSort(highterThanPivot), ]; };
额外补充:如果数组中有大量重复元素,把等于基准值的元素全放进同一组会影响排序效率,你可以额外创建一个数组存放等于pivot的元素进一步优化,但当前导致无限循环的根本问题已经通过调整起始索引解决。
内容的提问来源于stack exchange,提问作者user22467047
相关产品推荐
相关产品推荐

