前言
本文主要介绍冒泡排序,包含详细注释和优化:
原理
冒泡排序是通过重复遍历要排序的列表,比较相邻的元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。这样每次遍历都会把最大的元素“冒泡”到末尾。
实现示例
function bubbleSort(arr) {
const n = arr.length;
let swapped; // 用于优化:标记是否发生交换
// 外层循环控制遍历次数(每次遍历会确定一个最大值到末尾)
for (let i = 0; i < n - 1; i++) {
swapped = false;
// 内层循环比较相邻元素,每轮遍历可以减少比较次数(因为末尾已排序)
for (let j = 0; j < n - 1 - i; j++) {
// 如果前一个元素比后一个大,交换它们的位置
if (arr[j] > arr[j + 1]) {
// 使用解构赋值进行交换(无需临时变量)
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
// 优化:如果本轮未发生交换,说明已完全有序,提前终止排序
if (!swapped) break;
}
return arr;
}
// 示例使用
const unsortedArray = [64, 34, 25, 12, 22, 11, 90];
console.log("排序前:", unsortedArray);
console.log("排序后:", bubbleSort(unsortedArray));
代码解析
- 外层循环:控制遍历次数(
n-1
次),每次遍历会将未排序部分的最大值"冒泡"到正确位置 - 内层循环:
- 比较相邻元素
arr[j]
和arr[j+1]
- 使用解构赋值
[a, b] = [b, a]
高效交换元素 - 每轮遍历减少比较次数(
n-1-i
),因为末尾已排序部分无需再比较
- 比较相邻元素
- 优化标记:
swapped
变量检测本轮是否发生交换- 如果未发生交换,说明数组已完全有序,提前终止排序。这样可以减少不必要的比较,提升性能。
时间复杂度
场景 | 时间复杂度 |
---|---|
最好情况(已排序) | O(n) |
平均情况 | O(n²) |
最坏情况 | O(n²) |
执行示例
输入:
[64, 34, 25, 12, 22, 11, 90]
输出:
[11, 12, 22, 25, 34, 64, 90]
关键点总结
- 冒泡排序是稳定的排序算法(相同值元素相对位置不变)
- 空间复杂度为 O(1)(原地排序)
- 实际开发中效率较低,适用于教学或小规模数据排序
- 对比其他排序算法:快速排序 平均 O(n log n),更高效