冒泡排序时间复杂度为O(n²),适合教学和小规模数据;应注重逻辑清晰、边界安全、可读性强,而非性能;基础版需含“无交换即终止”优化。

冒泡排序本身时间复杂度为 O(n²),不适合处理大数据量,但作为基础算法练习和小规模数据(如几十个元素)的简单排序,它仍具教学与实用价值。关键在于写出逻辑清晰、边界安全、可读性强、符合PHP编码规范的实现,而非追求“高性能”——真要高效,请直接用 sort() 或 usort()。
基础版:标准双向比较 + 优化终止
避免每次都遍历到底,加入“本轮无交换则提前退出”的优化,显著提升已基本有序数组的效率:
function bubbleSort(array $arr): array
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
<pre class="brush:php;toolbar:false;">// 复制原数组,不修改输入
$sorted = $arr;
for ($i = 0; $i < $len - 1; $i++) {
$swapped = false; // 标记本轮是否发生交换
// 每轮后最大元素“冒泡”到末尾,范围缩小
for ($j = 0; $j < $len - 1 - $i; $j++) {
if ($sorted[$j] > $sorted[$j + 1]) {
[$sorted[$j], $sorted[$j + 1]] = [$sorted[$j + 1], $sorted[$j]];
$swapped = true;
}
}
// 若本轮无交换,说明已有序,提前结束
if (!$swapped) {
break;
}
}
return $sorted;}
增强版:支持自定义比较 + 类型安全
用回调函数支持字符串、对象或复杂规则排序,并做基础类型校验:
立即学习“PHP免费学习笔记(深入)”;
function bubbleSortCustom(array $arr, callable $compare = null): array
{
if (empty($arr)) {
return $arr;
}
<pre class="brush:php;toolbar:false;">$sorted = $arr;
$len = count($sorted);
// 默认升序比较函数
$compare = $compare ?? function ($a, $b) {
return $a <=> $b; // PHP 7+ 强类型太空船操作符
};
for ($i = 0; $i < $len - 1; $i++) {
$swapped = false;
for ($j = 0; $j < $len - 1 - $i; $j++) {
if ($compare($sorted[$j], $sorted[$j + 1]) > 0) {
[$sorted[$j], $sorted[$j + 1]] = [$sorted[$j + 1], $sorted[$j]];
$swapped = true;
}
}
if (!$swapped) {
break;
}
}
return $sorted;}
// 示例:按字符串长度降序 $result = bubbleSortCustom(['apple', 'cat', 'banana'], function($a, $b) { return strlen($b) strlen($a); });
规范要点总结
- 输入防御:检查空数组、单元素,避免无效循环
- 不修改原数组:始终返回新数组,符合函数式编程习惯
-
类型声明明确:参数用
array,返回值用: array -
命名语义化:函数名动词开头(
bubbleSort),变量名见名知意($swapped,$len) -
利用现代PHP特性:太空船操作符
、数组解构赋值简化交换逻辑
什么情况下不该用它?
当面对以下场景时,请果断放弃手写冒泡排序:
- 数组元素超过 500 个 —— 性能急剧下降
- 需频繁排序 —— 考虑预排序或更优算法(如快排、归并)
- 生产环境对响应时间敏感 —— 直接调用内置
sort()(底层为快速排序) - 需稳定排序且元素含复杂结构 —— 优先用
usort()+ 自定义比较器



















