冒泡排序降序实现是通过相邻元素比较,若左元素小于右元素则交换,使大数前移,最终数组从大到小排列;PHP8.1中可利用联合类型、严格比较和早期终止优化写出安全简洁版本。

冒泡排序原理与降序逻辑
冒泡排序通过相邻元素两两比较、交换,让较大(或较小)的元素像气泡一样逐渐“浮”到一端。要实现降序,每次比较时,若左边元素小于右边元素,就交换它们——这样大的数不断前移,最终数组从大到小排列。
PHP8.1中简洁实现降序冒泡排序
利用PHP8.1支持的联合类型、更严格的类型推断和简洁语法,可写出清晰、安全的版本:
- 定义函数接收数组,声明参数类型为
array,返回类型也为array - 使用
for循环控制轮次,内层循环范围逐轮缩小(已排好序的末尾无需再比) - 用严格比较
<判断是否交换,确保降序稳定 - 可选:添加早期终止优化——某轮无交换说明已有序,直接退出
示例代码:
function bubbleSortDesc(array $arr): array
{
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$swapped = false;
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($arr[$j] < $arr[$j + 1]) {
[$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
$swapped = true;
}
}
if (!$swapped) break;
}
return $arr;
}
<p>// 使用示例
$nums = [64, 34, 25, 12, 22, 11, 90];
print_r(bubbleSortDesc($nums)); // 输出:[90, 64, 34, 25, 22, 12, 11]</p>注意事项与常见问题
在PHP8.1环境下需留意:
立即学习“PHP免费学习笔记(深入)”;
- 数组元素应为同类型(如全为int/float),否则
<比较可能产生意外结果(如字符串与数字混排) - PHP8.1默认启用严格模式,避免在未声明类型的地方传入非数组值,否则会抛出
TypeError - 原地排序?本实现返回新数组,不修改原数组;如需原地修改,去掉
return $arr前的赋值,直接操作传入变量(注意引用传递问题) - 大数据量慎用——冒泡时间复杂度为O(n²),仅适合教学或小规模数据
扩展:支持自定义比较的通用版本
若需排序字符串、对象或按特定规则(如绝对值降序),可用callable参数增强灵活性:
function bubbleSortCustom(array $arr, callable $compare): array
{
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
$swapped = false;
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($compare($arr[$j], $arr[$j + 1]) < 0) {
[$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
$swapped = true;
}
}
if (!$swapped) break;
}
return $arr;
}
<p>// 按字符串长度降序
$result = bubbleSortCustom(['hi', 'hello', 'a'], fn($a, $b) => strlen($b) - strlen($a));</p>



















