冒泡排序是面试常考基础算法,核心为双层循环比较交换相邻元素;可优化提前终止、支持升序/降序及自定义比较;但时间复杂度o(n²),仅适用于教学或小规模数据。

冒泡排序是面试中常考的基础算法题,考察候选人对循环控制、数组操作和算法思想的理解。PHP 实现虽简单,但细节处理(如优化、边界、可读性)容易暴露编码习惯。
基础实现:双层 for 循环
核心逻辑是相邻元素两两比较,较大(或较小)的值像气泡一样“浮”到一端。PHP 中操作索引数组最直观:
- 外层循环控制轮数,最多 n-1 轮(n 为数组长度)
- 内层循环每轮减少一次比较(末尾已有序),范围从 0 到 n - i - 1
- 每次比较 $arr[j] 和 $arr[j+1],若逆序则交换
示例代码:
$arr = [64, 34, 25, 12, 22, 11, 90];
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
for ($j = 0; $j < $n - $i - 1; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}关键优化:提前终止(优化最好情况)
如果某一轮没有发生任何交换,说明数组已有序,可立即退出。这是面试加分点,体现对时间复杂度的敏感:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。
立即学习“PHP免费学习笔记(深入)”;
- 定义标志位 $swapped = false,在交换时置为 true
- 每轮开始前重置,结束后检查,为 false 则 break
- 优化后最好时间复杂度从 O(n²) 降到 O(n),适用于已排序或近似有序数据
增强健壮性:支持升序/降序与自定义比较
实际工程中不应硬编码比较逻辑。可通过参数控制方向,或接受回调函数:
- 添加 $ascending = true 参数,将比较改为 ($a > $b) !== $ascending
- 更灵活的方式是传入比较函数,类似 usort 的风格:function($a, $b) { return $a $b; }
- 注意空数组、单元素、非数值类型(如字符串)的兼容性处理
面试延伸:为什么不用它?对比其他排序
面试官可能追问适用场景与缺陷。需清晰表达:
- 时间复杂度固定较差:平均/最坏均为 O(n²),不适合大数据量
- 稳定排序(相等元素相对位置不变),但空间效率低(原地排序却频繁交换)
- PHP 内置 sort() 基于快速排序+插入排序混合实现,性能远超手写冒泡
- 仅适合教学、小规模数据或特殊嵌入式场景(内存极受限且代码体积敏感)










