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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:16:15