冒泡排序通过相邻元素比较交换使最大值逐轮上浮,最多n-1轮,可提前终止;快速排序采用分治法,选基准划分数组后递归排序左右子数组,核心为双指针分区。

冒泡排序和快速排序是两种经典排序算法,JavaScript 实现起来都不难,关键在于理解逻辑和边界处理。
冒泡排序:相邻比较,大数上浮
每次遍历把当前未排序部分的最大值“冒泡”到末尾,重复直到全部有序。
- 外层循环控制排序轮数(最多 n-1 轮)
- 内层循环做相邻比较,每轮可减少一次比较(因为末尾已有序)
- 可加优化:若某轮没发生交换,说明已有序,提前退出
function bubbleSort(arr) {
const a = [...arr]; // 不修改原数组
const n = a.length;
for (let i = 0; i < n - 1; i++) {
let swapped = false;
for (let j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
[a[j], a[j + 1]] = [a[j + 1], a[j]]; // 解构交换
swapped = true;
}
}
if (!swapped) break; // 提前结束
}
return a;
}快速排序:分治递归,基准划分
选一个基准(pivot),把数组分为“小于基准”“大于等于基准”两部分,再递归排序这两部分。
- 基准可选首元素、末元素或中间元素;简单起见常取中间或末尾
- 分区(partition)是核心:用双指针把小元素放左、大元素放右
- 递归终止条件:子数组长度 ≤ 1
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(arr.length / 2)];
const left = [], right = [], equal = [];
for (const x of arr) {
if (x < pivot) left.push(x);
else if (x > pivot) right.push(x);
else equal.push(x);
}
return [...quickSort(left), ...equal, ...quickSort(right)];
}
这是“简洁版”,易懂但额外用了空间。进阶可写原地分区(Lomuto 或 Hoare 分区方案),节省内存。
立即学习“Java免费学习笔记(深入)”;
对比与使用建议
- 冒泡排序时间复杂度 O(n²),仅适合教学或极小数组(如
- 快速排序平均 O(n log n),实际性能好,但最坏(已排序时)退化为 O(n²);可用随机选基准缓解
- 生产环境优先用 Array.prototype.sort()(V8 引擎底层混合了快排、插入和堆排)
- 自己实现时注意:避免直接修改原数组,测试边界 case(空数组、单元素、重复值、已排序)
基本上就这些。写出来不复杂,但细节(比如循环边界、递归出口、是否稳定)容易忽略。










