冒泡排序是通过多轮相邻比较与交换使元素逐步有序的算法。核心为两层循环:外层控制轮数(最多n-1轮),内层比较交换并缩小范围;设swapped标志可提前终止;时间复杂度最坏o(n²),最好o(n)。

冒泡排序是一种基础的排序算法,适合理解数组遍历和比较逻辑。它通过重复遍历数组,两两比较相邻元素并交换位置,让较大(或较小)的元素逐步“浮”到一端,像气泡上升一样。
冒泡排序的核心逻辑
关键在于两层嵌套循环:外层控制排序轮数(最多 n-1 轮),内层负责每轮的相邻比较与交换。每完成一轮,当前未排序部分的最大值就归位到末尾,因此内层循环范围可逐步缩小。
- 每轮遍历后,末尾元素已确定有序,下一轮无需再比较它
- 若某轮未发生任何交换,说明数组已完全有序,可提前结束
- 时间复杂度最坏为 O(n²),最好为 O(n)(已有序且加优化)
升序冒泡排序的实现步骤(以 JavaScript 为例)
假设数组为 [64, 34, 25, 12, 22, 11, 90]:
- 用 for 外层循环控制轮数:i 从 0 到 n-2
- 用 for 内层循环比较相邻项:j 从 0 到 n-2-i
- 若 arr[j] > arr[j+1],交换二者(可用解构赋值:[arr[j], arr[j+1]] = [arr[j+1], arr[j]])
- 可设标志位 swapped 记录本轮是否交换,提升效率
常见易错点提醒
初学者常在边界上出错:
- 内层循环上限写成 arr.length 会导致越界访问 arr[j+1]
- 忘记减 i,导致重复比较已排好序的末尾元素
- 交换逻辑写反(如把小值往右推),结果变成降序却没察觉
- 未处理空数组或单元素数组,虽不影响结果,但健壮性不足
简单可运行示例
以下代码可直接在浏览器控制台运行:
function bubbleSort(arr) {
const n = arr.length;
for (let i = 0; i arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
if (!swapped) break;
}
return arr;
}
console.log(bubbleSort([64, 34, 25, 12, 22, 11, 90])); // [11, 12, 22, 25, 34, 64, 90]











