冒泡排序基础逻辑是重复遍历数组、比较相邻元素并交换,使极值逐步浮至一端;优化一通过flag提前终止未交换轮次;优化二动态缩小内层比较边界;优化三双向遍历(鸡尾酒排序)每轮确定首尾两个位置。

冒泡排序基础逻辑
冒泡排序通过重复遍历待排序数组,比较相邻元素并交换位置,使较大(或较小)元素逐步“浮”到一端。标准实现时间复杂度为 O(n²),最坏和平均情况都需完整比较 n×(n−1)/2 次。
优化一:提前终止——检测是否已有序
若某轮遍历中未发生任何交换,说明数组已完全有序,可立即退出循环,避免冗余比较。
做法是设置一个 flag 标记,每轮开始置为 false,一旦发生交换就设为 true;本轮结束若仍为 false,则 break 外层循环。
示例关键片段:
for ($i = 0; $i $arr[$j + 1]) {
[$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
$swapped = true;
}
}
if (!$swapped) break;
}
优化二:缩小内层边界——已排好序的尾部不再参与
每轮冒泡后,最大(升序时)元素必然到达末尾位置,后续轮次无需再比较该位置及之后元素。
因此内层循环上限可动态调整为 $len - 1 - $i,其中 $i 是外层轮数,随迭代递增,有效减少比较次数。
- 第 0 轮:比较索引 0→$len−2(共 $len−1 次)
- 第 1 轮:比较索引 0→$len−3(共 $len−2 次)
- 第 i 轮:比较至 $len−2−i,共 $len−1−i 次
优化三:双向冒泡(鸡尾酒排序)——处理“乌龟”元素
当最小元素位于数组末尾(如 [5,4,3,2,1] → 最小值 1 在末尾),标准冒泡需多轮才能将其“浮”到开头,效率低下。双向冒泡在一次完整遍历中,先从左到右把最大值推至末尾,再从右到左把最小值推至开头。
这样每轮可确定两个位置(首尾),尤其适合两端无序、中间局部有序的场景。
实现要点:
- 用两个指针 $left 和 $right 控制当前未排序区间
- 正向遍历后 $right--,反向遍历后 $left++
- 每轮至少完成一次正向+一次反向,直到 $left ≥ $right
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











