冒泡排序PHP标准实现需封装为支持升序/降序、兼容数字字符串、可自定义比较的独立函数,内层循环上限为$n-1-i$以跳过已排好部分,避免无边界判断的简化版。

冒泡排序是面试中常被要求手写的基础算法,PHP实现需体现逻辑清晰、边界处理得当、代码规范。下面是一个符合生产环境习惯的标准写法。
标准可复用的函数定义
封装为独立函数,支持升序/降序,兼容数字与字符串(通过回调灵活比较):
function bubbleSort(array $arr, bool $ascending = true, callable $compare = null): array
{
if (count($arr) <= 1) {
return $arr;
}
<pre class='brush:php;toolbar:false;'>$result = $arr;
$n = count($result);
// 使用内置比较或自定义回调
$comparator = $compare ?? function ($a, $b) {
return $a <=> $b; // PHP 7+ 太空船操作符,天然支持数字/字符串/NULL
};
for ($i = 0; $i < $n - 1; $i++) {
$swapped = false;
// 每轮把最大(或最小)元素“冒泡”到末尾,所以范围递减
for ($j = 0; $j < $n - 1 - $i; $j++) {
$cmp = $comparator($result[$j], $result[$j + 1]);
$shouldSwap = $ascending ? ($cmp > 0) : ($cmp < 0);
if ($shouldSwap) {
[$result[$j], $result[$j + 1]] = [$result[$j + 1], $result[$j]];
$swapped = true;
}
}
// 提前终止:若某轮未发生交换,说明已有序
if (!$swapped) {
break;
}
}
return $result;}
常见面试追问点与应对说明
- 时间复杂度:最坏和平均 O(n²),最好(已有序)O(n),因有提前终止机制
- 空间复杂度:O(1),原地排序,只用常数额外变量
-
稳定性:是稳定排序——相等元素不交换位置(代码中
$cmp > 0而非>= 0) -
为什么内层循环上限是
$n - 1 - $i:每轮确定一个极值在末尾,后续无需再比已排好的部分
调用示例与验证
直接测试不同场景,体现健壮性:
立即学习“PHP免费学习笔记(深入)”;
// 数字升序 var_dump(bubbleSort([64, 34, 25, 12, 22, 11, 90])); // → [11, 12, 22, 25, 34, 64, 90] <p>// 字符串降序 var_dump(bubbleSort(['banana', 'apple', 'cherry'], false)); // → ['cherry', 'banana', 'apple']</p><p>// 自定义规则:按字符串长度升序 var_dump(bubbleSort(['php', 'javascript', 'go'], true, fn($a, $b) => strlen($a) <=> strlen($b))); // → ['go', 'php', 'javascript']</p>
不推荐的“教学版”陷阱
面试时避免写这种简化但不严谨的版本:
// ❌ 缺少边界判断、无提前退出、硬编码逻辑、不支持自定义比较
for ($i = 0; $i < count($arr); $i++) {
for ($j = 0; $j < count($arr)-1; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
它暴露对数组空/单元素处理缺失、性能优化意识弱、扩展性差等问题,易被追问扣分。



















