学习首页/排序算法/快速排序交互演示 · JavaScript

排序算法 QUICK SORT

快速排序.

选定基准值完成分区,再递归排序左右两侧。

时间平均 O(n log n) / 最坏 O(n²)额外空间平均 O(log n) / 最坏 O(n)稳定性不稳定

原理与执行逻辑

选取一个基准值,将当前区间分成较小元素、基准和其余元素三部分。基准放到最终位置后,递归处理左右区间。

执行步骤

  1. 取区间末尾的值为 pivot,i 指向较小元素区间的下一空位。
  2. 用 j 扫描基准之前的元素,遇到小于 pivot 的值就交换到 i,再增加 i。
  3. 扫描结束后交换 i 与末尾,使基准就位。
  4. 分别排序基准左侧与右侧,长度不超过 1 的区间直接返回。

关键理解

扫描时 [left, i) 中的值都小于基准,[i, j) 中的值都不小于基准。当前实现固定选末尾,分区长期偏斜时会退化为 O(n²)。

简短示例

[4, 2, 5, 3] 以 3 为基准,将 2 移到前面,再放入基准,得到 [2, 3, 5, 4],随后处理 [5, 4]。

代码与执行动画

STEP 0 / 47
快速排序
function quickSort(arr, left = 0, right = arr.length - 1) {  if (left >= right) return arr;  const pivot = arr[right];  let i = left;  for (let j = left; j < right; j++) {    if (arr[j] < pivot) {      [arr[i], arr[j]] = [arr[j], arr[i]];      i++;    }  }  [arr[i], arr[right]] = [arr[right], arr[i]];  quickSort(arr, left, i - 1);  quickSort(arr, i + 1, right);  return arr;}
15 行 · 0 个片段标记

高亮对应当前步骤;源码对传入数组进行原地排序。

数组状态

升序 · 8 个元素
比较 0实际交换 0数组写入 0当前区间 —
待排序当前操作基准已就位

下标显示在底部;柱体随元素移动,等值元素也保留独立身份。

0

准备排序

点击下一步或自动播放,观察数组从左到右升序排列的过程。

调整待排序数组

使用相同数据切换算法,观察比较与交换过程。

2 至 12 个整数,范围 1 至 99;逗号或空格分隔。

算法要点

快速排序的执行规则

本实现采用 Lomuto 分区,以区间末尾元素为基准;递归栈占用计入空间复杂度。

交换次数仅统计两个不同位置的交换;可输入重复值。

对应题目与扩展练习

观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。