php冒泡排序核心是相邻元素两两比较、大的往后挪,每轮将最大值“冒泡”至末尾,共需n-1轮;可优化为提前终止,封装成函数支持任意数组,但时间复杂度为O(n²),仅适用于小数据或教学。

PHP冒泡排序从小到大,核心是**相邻元素两两比较、大的往后挪**,每轮把当前最大值“冒泡”到末尾,重复n-1轮即可完成升序排列。
基本实现(双层for循环)
这是最直观的写法,适合理解原理:
- 外层控制轮数(共count($arr) – 1轮)
- 内层控制每次比较范围(每轮末尾已有序,可缩小范围)
- 若前一个元素大于后一个,就交换位置
$arr = [64, 34, 25, 12, 22, 11, 90]; <p>$n = count($arr); for ($i = 0; $i < $n - 1; $i++) { for ($j = 0; $j < $n - 1 - $i; $j++) { if ($arr[$j] > $arr[$j + 1]) { // 交换 $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } } }</p><p>print_r($arr); // 输出:[11, 12, 22, 25, 34, 64, 90]
优化版(提前结束)
如果某一轮没发生任何交换,说明数组已经有序,可提前退出,避免多余循环:
$arr = [64, 34, 25, 12, 22, 11, 90]; $n = count($arr); <p>for ($i = 0; $i < $n - 1; $i++) { $swapped = false; for ($j = 0; $j < $n - 1 - $i; $j++) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; $swapped = true; } } if (!$swapped) break; }
封装成函数(支持任意数组)
写成函数更实用,注意传参用引用&$arr可直接修改原数组:
立即学习“PHP免费学习笔记(深入)”;
function bubblesort(&$arr) { $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]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; $swapped = true; } } if (!$swapped) break; } } <p>// 使用示例 $nums = [5, 2, 8, 1, 9]; bubbleSort($nums); print_r($nums); // [1, 2, 5, 8, 9]
注意事项和局限性
冒泡排序简单易懂,但效率不高,仅适合小数据或教学场景:
基本上就这些。理解思路比死记代码更重要——记住“两两比、大的沉底、轮轮缩、早停省力”。