冒泡排序时间复杂度最坏和平均为O(n²),最好为O(n);空间复杂度恒为O(1);优化版通过swapped标志提前终止,未优化版无法触发最好情况;相比PHP内置sort()的O(n log n),仅适用于教学或极小几乎有序数据。

PHP中实现冒泡排序,其时间复杂度最坏和平均情况下都是O(n²),最好情况(输入已有序)为O(n);空间复杂度恒为O(1)。
时间复杂度取决于比较与交换的总次数
冒泡排序通过多轮遍历完成排序,每轮将当前未排序部分的最大值“冒泡”到末尾:
- 最坏情况(数组完全逆序):需进行 n−1 轮,第 i 轮比较 n−i 次,总比较次数为 (n−1)+(n−2)+⋯+1 = n(n−1)/2 → 属于 O(n²)
- 平均情况:元素随机分布,仍需约 n²/4 次比较和交换 → 同样是 O(n²)
- 最好情况(数组已升序):第一轮遍历无任何交换,算法可提前终止 → 仅执行一次完整扫描,共 n−1 次比较 → O(n)
空间复杂度只消耗固定数量的辅助变量
冒泡排序是原地排序算法,不依赖额外数据结构:
- 仅使用几个固定变量:如循环索引 $i、$j,临时交换变量 $temp(或利用 PHP 的列表赋值语法 $arr[$j], $arr[$j+1] = $arr[$j+1], $arr[$j])
- 变量个数不随输入数组长度 $n 增长 → 额外空间恒定 → 空间复杂度为 O(1)
PHP实现中的关键细节影响实际表现
虽然理论复杂度不变,但代码写法会影响是否触发最好情况的优化:
立即学习“PHP免费学习笔记(深入)”;
- 未加优化版本:固定执行 n−1 轮,无法提前退出,导致最好情况也耗时 O(n²)
- 带标志位的优化版本:引入 $swapped 标志,某轮无交换即 break,使已排序数组只需 O(n) 时间
- 注意边界:内层循环上限应为 $n − $i − 1,避免越界访问和冗余比较
与其他PHP内置排序对比更显局限性
PHP 的 sort() 函数底层使用优化的快速排序或归并排序(具体取决于 PHP 版本和数据特征),平均时间复杂度为 O(n log n),远优于冒泡排序:
- 对千级以下小数组,差异不明显;但一旦数据量达万级,O(n²) 会迅速拖慢响应
- 冒泡排序主要价值在于教学和理解排序逻辑,而非生产环境使用
- 若需手写简单排序且数据极小、几乎有序,优化版冒泡可作为轻量备选



















