数据结构与算法演示台SUANFA.NET.CN · STEP BY STEP

排序 · 单步演示

冒泡排序

反复比较相邻的两个数,前大后小就交换。每一轮都会把剩下部分的最大值推到末尾,像气泡一样浮上去。

1 到 16 个整数(−99 到 999),用逗号或空格隔开。 输入只在你的浏览器里计算,不会上传。

380
121
712
53
444
265
906
177

当前操作已就位

步 001 / 054初始数组,共 8 个数。每一轮把当前最大的数「冒」到末尾。

键盘: 单步,空格 播放/暂停(先点一下演示区)。

伪代码 · 当前行高亮

  1. for i ← 0 … n−2
  2. swapped ← false
  3. for j ← 0 … n−2−i
  4. if a[j] > a[j+1]
  5. 交换 a[j]、a[j+1];swapped ← true
  6. if swapped = false:提前结束
  7. 结束

变量

比较次数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 次虽然结果对,但白做了很多比较。

同一类的其他演示