PHP 冒泡排序与快速排序算法实例详解
本文详解PHP中常用的冒泡排序与快速排序算法,提供完整代码示例供开发者直接参考与应用。
准备条件与核心逻辑
在 PHP 开发中,处理数组数据的有序排列是常见需求。以下将分别解析两种经典算法的实现步骤:一种是直观但效率较低的“冒泡排序”,另一种是分治策略高效执行的“快速排序”。
第1步:理解冒泡排序的基础实现
目的:展示最基本的两两交换思想,适合理解排序原理。入口:定义待排序数组。动作:外层循环控制遍历趟数(共 $len-1$ 趟),内层循环从后向前比较相邻元素并交换。参数:$i$ 为当前趟数,$j$ 为比较索引。状态:每轮结束后,未排序部分的最大值会被推到前端或固定位置(视循环方向而定)。
$a=array('3','8','1','4','11','7');
print_r($a);
$len = count($a);
//从小到大排序
for($i=1;$i<$len;$i++)\n{
for($j=$len-1;$j>=$i;$j--)\n {
if($a[$j]<$a[$j-1])\n { //从大到小只需将 < 改为 >
$x=$a[$j];\n $a[$j]=$a[$j-1];\n $a[$j-1]=$x;
}
}
}
print_r($a);
第2步:优化版冒泡排序
目的:减少不必要的比较次数,提升性能。动作:引入 $flag 布尔变量记录本趟是否发生交换。若一整趟均未交换,说明已有序,提前跳出循环。重要参数:$flag 初始化为 false,每次交换置为 true。
function maopao($arr)\n{
$len = count($arr);\n for($i=1; $i<$len; $i++) //最多做 n-1 趟排序\n {\n $flag = false; //标记本轮是否有交换\n for($j=$len-1;$j>=$i;$j--)\n {\n if($arr[$j]<$arr[$j-1])//交换记录\n { //从大到小修改判断符即可\n $x=$arr[$j];\n $arr[$j]=$arr[$j-1];\n $arr[$j-1]=$x;\n $flag = true; //发生了交换,标志位置真\n }
}\n if(! $flag) //如果上一轮没发生交换,说明已经排好序了,提前终止\n return $arr; \n }
}
第3步:掌握快速排序算法
目的:利用递归和分区技巧实现更高效的 O(n log n) 平均时间复杂度排序。入口:接收一个关联或索引数组。动作:选择一个基准值(通常取首个元素 $key),小于等于基准的值放入左数组,大于的放入右数组。对左右子数组递归执行该过程,最后拼接结果。
// 快速排序函数定义\nfunction kuaisu($arr)\n{\n $len = count($arr);\n if($len <= 1){ //基准情况:长度小于等于1时返回本身\n return $arr;\n }\n $key = $arr[0]; //选择第一个元素作为基准\n $left_arr = array(); //存放小于基准的元素\n $right_arr = array(); //存放大于基准的元素\n
for($i=1; $i<$len;$i++){ //遍历除基准外的其余元素\n if($arr[$i] <= $key){\n $left_arr[] = $arr[$i];\n }else{\n $right_arr[] = $arr[$i];\n }
}\n
//递归调用自身,并将结果合并:[左边排序好的] + [基准] + [右边排序好的]\n $left_arr = kuaisu($left_arr);\n $right_arr = kuaisu($right_arr);\n return array_merge($left_arr, array($key), $right_arr);
}
第4步:运行测试与验证
操作:调用上述函数并打印结果进行核对。结果:观察控制台输出是否符合从小到大的顺序。
$shuz = array('2','4','1','8','5');
$bb = maopao($shuz); // 测试冒泡\nprint_r($bb);\n\n$arr = array(23,98,54,2,9,62,34);\nprint_r(kuaisu($arr)); // 测试快速
以上就是关于 PHP 冒泡排序与快速排序算法的详细内容,更多关于 PHP 排序的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













