PHP四种基础排序算法详解与实现
算法是程序的核心,决定了执行效率与代码质量。作为开发者,掌握基础的排序逻辑至关重要。本文将深入剖析PHP中四种最常见的排序算法:冒泡排序、选择排序、插入排序和快速排序,通过具体的原理分析与代码实现,展示如何对数据进行高效处理。
目标与准备
为了直观演示四种算法的差异,我们使用同一组未排序的整数数组作为测试数据:
$arr = array(1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39);
所有示例的目标均为将该数组中的元素按从小到大的顺序进行重排。
1. 冒泡排序 (Bubble Sort)
第1步:理解相邻交换逻辑
冒泡排序的核心在于“比较”与“交换”。从头到尾扫描序列,如果相邻的两个元素顺序错误(前大于后),则交换它们。每一轮遍历都会将当前未排序部分的最大值“浮”到末尾。
第2步:PHP代码实现
通过两层循环控制遍历轮数和每轮的比较次数。外层循环确定需要进行的轮数,内层循环负责执行两两比较。
function bubbleSort($arr) {
$len = count($arr);
// 控制冒泡的轮数
for($i = 1; $i < $len; $i++) {
// 每轮冒出一个最大值,需比较的次数随轮次减少
for($k = 0; $k < $len - $i; $k++) {
if($arr[$k] > $arr[$k+1]) {
// 发生逆序则交换
$tmp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
2. 选择排序 (Selection Sort)
第1步:定位最小值并交换
选择排序的思路是每次从未排序区间中找到最小的元素,将其放到已排序区间的末尾。它与冒泡排序的区别在于减少了交换次数,只在确定最小值位置后才进行一次交换。
第2步:PHP代码实现
外层循环控制当前位置$i,内层循环从$j=$i+1开始寻找比$arr[$i]更小的值。一旦发现更小值,记录其索引$p,待内层循环结束后再执行交换。
function selectSort($arr) {
$len = count($arr);
for($i = 0; $i < $len - 1; $i++) {
$p = $i; // 假设当前位置为最小值索引
for($j = $i + 1; $j < $len; $j++) {
if($arr[$p] > $arr[$j]) {
$p = $j; // 更新最小值索引
}
}
// 仅当最小值不在当前位置时才交换
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
3. 插入排序 (Insertion Sort)
第1步:构建有序序列
插入排序模拟打牌时的理牌过程。它将数组分为“已排序”和“未排序”两部分,初始时将第一个元素视为已排序。随后逐个取出未排序的元素,在已排序序列中从后向前扫描,找到合适位置并插入。
第2步:PHP代码实现
外层循环从$i=1开始处理每个新元素。内层循环$j从$i-1倒推,若发现已排序元素大于待插入元素$tmp,则将其后移一位,直到找到合适的插入点或到达数组开头。
function insertSort($arr) {
$len = count($arr);
for($i = 1; $i < $len; $i++) {
$tmp = $arr[$i]; // 暂存当前待插入元素
// 在已排序部分中寻找插入位置
for($j = $i - 1; $j >= 0; $j--) {
if($tmp < $arr[$j]) {
$arr[$j+1] = $arr[$j]; // 较大元素后移
$arr[$j] = $tmp; // 临时占位
} else {
break; // 找到不大于tmp的位置,后续无需比较
}
}
}
return $arr;
}
4. 快速排序 (Quick Sort)
第1步:分治法递归处理
快速排序是一种高效的递归算法。首先选择一个基准元素(本例选第一个),然后通过一趟扫描将数组分为两部分:小于基准的放左边,大于等于基准的放右边。基准元素此时已在最终正确位置。随后对左右两个子数组递归执行相同操作。
第2步:PHP代码实现
注意基线条件:当数组长度小于等于1时直接返回,避免无限递归。利用数组操作将元素分类后,合并结果。
function quickSort($arr) {
$length = count($arr);
if($length <= 1) {
return $arr;
}
$base_num = $arr[0]; // 选择基准
$left_array = array();
$right_array = array();
for($i = 1; $i < $length; $i++) {
if($base_num > $arr[$i]) {
$left_array[] = $arr[$i]; // 放入左边
} else {
$right_array[] = $arr[$i]; // 放入右边
}
}
// 递归排序并合并
$left_array = quickSort($left_array);
$right_array = quickSort($right_array);
return array_merge($left_array, array($base_num), $right_array);
}
总结
这四种算法涵盖了从简单的线性比较到复杂的分治递归。冒泡和选择排序易于理解但效率较低;插入排序在小数据量时表现良好;快速排序则在大多数情况下拥有更高的执行效率。了解它们的实现细节有助于在实际开发中根据场景选择合适的排序策略。
以上就是PHP四种基本排序算法的详细分析与代码实现,更多关于PHP算法技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









