排序 · 单步演示
冒泡排序
反复比较相邻的两个数,前大后小就交换。每一轮都会把剩下部分的最大值推到末尾,像气泡一样浮上去。
当前操作已就位
步 001 / 054初始数组,共 8 个数。每一轮把当前最大的数「冒」到末尾。
键盘:← → 单步,空格 播放/暂停(先点一下演示区)。
伪代码 · 当前行高亮
for i ← 0 … n−2swapped ← falsefor j ← 0 … n−2−iif a[j] > a[j+1]交换 a[j]、a[j+1];swapped ← trueif swapped = false:提前结束结束
变量
| 比较次数 | 0 |
|---|---|
| 交换/写入次数 | 0 |
复杂度
| 最好情况 | O(n) |
|---|---|
| 平均情况 | O(n²) |
| 最坏情况 | O(n²) |
| 额外空间 | O(1) |
| 稳定性 | 稳定 |
最好情况要靠 swapped 标记:输入本来有序时,第一轮一次交换都没有就能停,只比较 n−1 次。没有这个标记,最好情况也是 O(n²)。
要点
- 第 k 轮结束后,最后 k 个位置一定已经就位,所以内层循环每轮少比一次。
- 只有「前者严格大于后者」才交换,相等的两个数不会互换位置,所以它是稳定的。
- 交换次数恰好等于输入里的逆序对个数。
常见错误
把内层循环写成 j ← 0 … n−1 会越界访问 a[n];写成每轮都跑满 n−1 次虽然结果对,但白做了很多比较。