冒泡排序的嵌套循环是协同推进的“轮次收缩”过程:外层控制n−1轮排序,每轮使一个最大值归位;内层执行相邻比较与交换,范围逐轮缩小。

冒泡排序的嵌套循环不是两个独立动作,而是一个协同推进的“轮次收缩”过程:外层定轮数,内层做比较,每轮都让一个最大值归位,后续轮次自然缩小范围。
外层循环:控制排序轮数
它决定整个排序要跑几轮。对长度为 n 的数组,最多需要 n−1 轮——因为最后一轮结束后,只剩一个数没参与比较,它必然已在正确位置。常见写法是:
for ($i = 0; $i (从第 0 轮到第 n−2 轮)- 也有写成
for ($i = 1; $i ,本质相同,只是起始计数习惯不同
内层循环:划定当轮比较范围
它的边界会随外层轮次动态收缩。第 i 轮时,末尾已有 i 个元素排好序(最大值已“沉底”),所以只需比较前 n − i 个位置,即索引从 0 到 n − i − 2(因要访问 $arr[$j+1],上限得留一位)。
- 第 0 轮:比较索引 0→1、1→2、…、n−2→n−1(共 n−1 次)
- 第 1 轮:比较索引 0→1、1→2、…、n−3→n−2(共 n−2 次)
- 第 i 轮:比较次数为 n−i−1 次
交换动作:只在相邻逆序时触发
内层每次取一对相邻元素 $arr[$j] 和 $arr[$j+1],用 > 判断是否升序错误。一旦发现前者更大,立刻交换:
立即学习“PHP免费学习笔记(深入)”;
- 传统写法:
$temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; - PHP 7.1+ 推荐写法:
[$arr[$j], $arr[$j+1]] = [$arr[$j+1], $arr[$j]];,简洁且无临时变量
为什么这样能保证有序?
每轮内层循环走完,当前未排序部分的最大值一定被交换到了该部分的末尾。例如数组 [5, 2, 8, 1]:
- 第 0 轮后 →
[2, 5, 1, 8](8 冒泡到末尾) - 第 1 轮后 →
[2, 1, 5, 8](5 归位) - 第 2 轮后 →
[1, 2, 5, 8](2 和 1 完成最后调整)
轮次和范围的配合,让每轮都“挤出”一个确定位置的极值,不遗漏也不重复。



















