PHP 实现冒泡排序代码详解与优化
冒泡排序是基础的排序算法之一,PHP 实现简单直观。核心在于通过相邻元素的比较与交换,将最大值逐层“冒泡”至数组末端。本文将演示原始逻辑代码,并提供带提前终止条件的优化方案,以应对大部分已排序数据的场景。
冒泡排序原理
冒泡排序(Bubble Sort)的基本操作是重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
具体流程如下:
- 第一趟:从第一个元素开始,依次比较相邻的两个数。如果前一个数大于后一个数,则交换位置。经过这一轮比较,最大的数会被移动到数组的最末尾。
- 后续趟数:排除已排好序的最后一个元素,对剩余未排序部分重复上述过程。第二趟结束后,第二大数会位于倒数第二位。
- 结束条件:持续这个过程,直到某一趟中没有发生任何交换,或者所有元素都已归位,排序完成。
PHP 代码实现
第1步:定义基础排序函数
在 PHP 中,数组默认是按值传递的。为了直接在原数组上进行修改,我们需要使用引用符号 & 将数组传入函数。以下是标准的实现代码:
<?php
/**
* 冒泡排序函数
* @param array $arr 引用传递的待排序数组
*/
function bubbleSort(&$arr) {
$len = count($arr);
// 外层循环控制需要进行多少趟比较
for ($i = 0; $i < $len - 1; $i++) {
// 内层循环进行相邻元素比较,每次减少已排好的尾部元素
for ($j = 0; $j < $len - 1 - $i; $j++) {
// 如果前一个元素大于后一个元素,则交换
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
}
// 测试数据
$data = array(100, 99, 200, 5, -4, 6, -7);
bubbleSort($data);
print_r($data);
?>
运行上述代码,输出结果为: -7, -4, 5, 6, 99, 100, 200
第2步:引入优化逻辑(可选)
原始版本在所有情况下都会跑完所有循环。但在某些场景下,数组可能在中间某趟就已经完全有序。此时应加入 $flag 标记,若一趟内无交换发生,则提前结束循环,从而提高执行效率。
<?php
function optimizedBubbleSort(&$arr) {
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$flag = true; // 假设本趟无序
for ($j = 0; $j < $len - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
// 交换逻辑
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
$flag = false; // 发生了交换,数组仍可能无序
}
}
// 如果本趟没有发生任何交换,说明数组已有序,直接退出
if ($flag) break;
}
}
?>
注意事项
- 性能瓶颈:冒泡排序的时间复杂度为
O(n²),适合数据量较小或基本有序的场景。对于大规模数据,建议使用sort()内置函数或快速排序等更高效率的算法。 - 参数类型:务必注意函数签名中的
&$arr,缺少它会导致函数内部修改不影响外部变量。
以上就是 PHP 实现冒泡排序的详细代码实例与优化思路,更多关于 PHP 算法基础的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













