冒泡排序核心是相邻比较与交换上浮:每轮将未排序部分最大值“冒泡”至末尾,共需最多n−1轮;内层循环边界动态收缩,且若某轮无交换则提前终止,保证稳定性与o(n)最佳时间复杂度。

冒泡排序的核心逻辑,就是“相邻比较、交换上浮”。它不靠全局扫描找极值,而是靠一次次“推着大数往后走”,让最大(或最小)的元素在每轮中自然抵达它该在的位置——就像水里气泡总往上升一样直观。
每一轮只确定一个位置
对长度为 n 的数组,最多只需 n−1 轮遍历。因为每轮结束时,当前未排序部分的最大值一定被交换到了末尾,这个位置从此固定,不再参与后续比较:
- 第 1 轮后:索引 n−1 处是全局最大值
- 第 2 轮后:索引 n−2 处是剩余元素中的最大值
- ……
- 第 n−1 轮后:前两个元素完成最终定位,整个数组有序
内层循环边界必须动态收缩
如果内层循环每次都从头比到尾,会做大量无效比较。正确做法是随轮次递减比较范围:
- 第 i 轮(i 从 0 开始),只需比较到索引 n−2−i
- 对应 PHP 写法:
for($j = 0; $j - 这样第 0 轮比 n−1 次,第 1 轮比 n−2 次……最后一轮只比 1 次
提前终止才是真优化
很多教程只讲收缩边界,却忽略更关键的一点:若某轮全程没发生任何交换,说明数组已经有序,应立刻停止。实现方式很简单:
- 每轮开始前设 $swapped = false
- 只要发生一次交换,就置为 true
- 本轮结束后检查,若仍是 false,直接 break 外层循环
- 这对近乎有序的数据效果极明显,最好情况时间复杂度降到 O(n)
它天生稳定,但绝不适合大数据
冒泡排序是稳定排序——相等元素的相对位置不会改变,因为只在 > 时才交换,== 不触发动作。但它本质仍是 O(n²) 算法:
- 小规模数据(如几十个元素)、教学演示、调试中间状态,它清晰可靠
- 生产环境处理上千条记录,应直接用
sort()或usort() - 面试时若被问到,重点不是写对基础双循环,而是能说清“为什么收缩边界”“什么时候可以提前停”“它稳在哪”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











