当前位置: 首页 > news >正文

js中,什么是快速排序(Quick Sort)

在 JavaScript 中,快速排序(Quick Sort)是一种高效的、基于分治思想(Divide and Conquer)的递归排序算法。它通过选择一个“基准值”(pivot),将数组划分为两个子数组:

  • 一个包含所有小于等于 pivot的元素,
  • 另一个包含所有大于 pivot的元素,

然后递归地对这两个子数组进行排序,最终合并得到有序数组。

✅ 快速排序的核心步骤(JS 版)

  1. 选基准(pivot):通常选中间、首尾或随机元素。
  2. 分区(partition):将数组按 pivot 分成左右两部分。
  3. 递归排序左右子数组
  4. 合并结果(在非原地实现中)。

🧩 简洁版(函数式风格,非原地排序)

这是 JavaScript 中最常见、易读的快排写法(不修改原数组):

function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivot = arr[Math.floor(arr.length / 2)]; // 选中间元素为 pivot const left = []; const right = []; const equal = []; for (let element of arr) { if (element < pivot) { left.push(element); } else if (element > pivot) { right.push(element); } else { equal.push(element); } } return [...quickSort(left), ...equal, ...quickSort(right)]; } // 示例 const arr = [38, 27, 43, 3, 9, 82, 10]; console.log(quickSort(arr)); // 输出: [3, 9, 10, 27, 38, 43, 82]
✅ 优点:代码简洁、易理解、不会改变原数组。
❌ 缺点:不是原地排序,空间开销较大(每次创建新数组)。

🔧 原地排序版(In-place,更高效)

如果你希望直接修改原数组以节省内存,可以使用索引和分区函数:

function quickSortInPlace(arr, low = 0, high = arr.length - 1) { if (low < high) { const pi = partition(arr, low, high); // 获取 pivot 正确位置 quickSortInPlace(arr, low, pi - 1); // 排序左半部分 quickSortInPlace(arr, pi + 1, high); // 排序右半部分 } return arr; } function partition(arr, low, high) { const pivot = arr[high]; // 选最后一个为 pivot let i = low - 1; // 小于 pivot 区域的边界 for (let j = low; j < high; j++) { if (arr[j] <= pivot) { i++; [arr[i], arr[j]] = [arr[j], arr[i]]; // 交换 } } [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]]; // pivot 归位 return i + 1; } // 示例 const arr = [38, 27, 43, 3, 9, 82, 10]; quickSortInPlace(arr); console.log(arr); // 输出: [3, 9, 10, 27, 38, 43, 82]
✅ 优点:原地排序,空间复杂度更低(O(log n) 递归栈)。
⚠️ 注意:会修改原始数组。

⏱️ 时间复杂度(JavaScript 中同样适用)

情况时间复杂度
平均情况O(n log n)
最好情况O(n log n)
最坏情况O(n²)(如已排序 + 固定 pivot)
💡 实际中可通过随机选 pivot三数取中来避免最坏情况。

🆚 与Array.prototype.sort()对比

  • JS 内置的arr.sort()在现代引擎(V8)中通常使用TimsortIntrosort(快排+堆排+插入排序混合),性能更优且稳定。
  • 手写快排主要用于学习算法原理或特定场景(如自定义比较逻辑)。
// 内置排序(推荐日常使用) arr.sort((a, b) => a - b);

✅ 总结

特性快速排序(JS)
是否稳定❌ 不稳定(它在分区(partition)过程中可能会改变相等元素的相对顺序。)
是否原地可实现(看具体写法)
平均时间复杂度O(n log n)
适用场景学习分治思想、面试、自定义排序逻辑
http://www.jsqmd.com/news/421787/

相关文章:

  • fs文件系统模块
  • Azure DevOps:移除TFVC中过时的签入策略
  • 前端组件库开发实践:从零到发布
  • 滚动锁定:用户向上翻看历史时,如何阻止 AI 新消息把它“顶”下去?
  • 深度测评:哪个执业医师课程通过率最高? - 医考机构品牌测评专家
  • 2011-2024年各省、地级市公众环境关注度数据
  • 开源一个 React 股票 K 线图组件,传个股票代码就能画图
  • 为什么我就想要「线性历史 + Signed Commits」,GitHub 却把我当猴耍 ️
  • 2026.2.28 模拟赛
  • 基于C-V2X的协同感知、协同预测与协同规划:标准、现状与未来展望
  • 7. STL简介
  • 复合赋值运算符+字符串拼接优先级
  • 推荐一个口腔执业医师课程 - 医考机构品牌测评专家
  • 2026西安普内科副主任医师考试用书推荐, 高分考生亲测:这些教材成功上岸 - 医考机构品牌测评专家
  • 大盘风险控制策略分析报告 - 2026年02月28日
  • 指月之手——活在当下的意义行动
  • 7864838
  • 468513
  • C# 里的 dynamic 或者 object 在 C++ 里的对应
  • 在文本行内加个倒计时(循环)
  • 二进制部署 kafka 4.20 并开启认证
  • 论文写作神器:免费大纲,降AI率,轻松通过知网
  • WPForms 与 OptinMonster 结合:如何构建功能强大的浮动联系表单
  • 学术写作不求人:2026论文“去AI化”与降重软件盘点
  • 岩石的剪胀性
  • 收藏!揭秘Deepseek爆火背后的AI力量,企业如何借力实现数字化转型?
  • 2026年硕士论文攻略:从初稿生成到降AI率的工具合集
  • 别等被AI甩下!程序员收藏:AI转型不慌,这5大工具让你效率起飞!
  • 2026年AI趋势:落地为王!省钱、解决真问题才是硬道理,收藏看懂未来!
  • 最佳少儿编程APP推荐:为孩子选择合适的编程学习工具 - 品牌测评鉴赏家