PHP常用排序与查找算法实现详解

Owen
Owen
发布时间:2026-10-13 | 5人浏览过
原创

PHP开发中常涉及数据处理,掌握基础排序与查找算法能显著提升程序效率。本文汇总了PHP最常用的冒泡、选择、插入和快速排序法,以及顺序查找和二分查找的实现代码,为算法设计提供参考。

PHP排序算法实现

第1步:使用冒泡排序法进行数组排序

目的:通过相邻元素比较交换,将数组从小到大排列。该算法包含优化标志位,若无交换则提前结束。

操作说明:调用 bubbleSort(&$arr) 函数,传入引用数组。算法外层循环控制轮数,内层循环比较相邻项。若前项大于后项则交换,并标记 $flag=true;若一轮内无交换,则跳出循环。

<?php
function bubbleSort(&$arr){
 $temp=0;
 $flag=false;
 for($i=0;$i<count($arr)-1;$i++){
   for($j=0;$j<count($arr)-1-$i;$j++){
     if($arr[$j]>$arr[$j+1]){
        $temp=$arr[$j];
        $arr[$j]=$arr[$j+1];
        $arr[$j+1]=$temp;
        $flag=true;
     }
   }
   if(!$flag){
    break;
   }
   $flag=false;
  }
}

第2步:使用选择排序法优化性能

目的:相比冒泡排序,减少交换次数,提高效率。每次从未排序部分选出最小值放到已排序部分的末尾。

操作说明:调用 selectSort(&$arr)。遍历数组假设当前索引为最小值,内层循环寻找实际最小值的下标 $minIndex 和值 $minVal,最后执行一次交换操作。

<?php
function selectSort(&$arr){
  $temp=0;
  for($i=0;$i<count($arr)-1;$i++){
    $minVal=$arr[$i];
    $minIndex=$i;
    for($j=$i+1;$j<count($arr);$j++){
      if($minVal>$arr[$j]){
         $minVal=$arr[$j];
         $minIndex=$j;
      }
    }
    $temp=$arr[$i];
    $arr[$i]=$arr[$minIndex];
    $arr[$minIndex]=$temp;
  }
}

第3步:使用插入排序法处理有序子序列

目的:将未排序元素逐个插入到已排序部分的正确位置。对于小规模或部分有序数据效率较高。

操作说明:调用 insertSort(&$arr)。从第二个元素开始,取出待插入值 $insertVal,在已排序区间内从后向前扫描,若发现比 $insertVal 大的数则向后移动,直到找到合适位置插入。

<?php
function insertSort(&$arr){
  for($i=1;$i<count($arr);$i++){
    $insertVal=$arr[$i];
    $inserIndex=$i-1;
    while($inserIndex >= 0 && $insertVal < $arr[$inserIndex]){
      $arr[$inserIndex+1] = $arr[$inserIndex];
      $inserIndex--;
    }
    $arr[$inserIndex+1] = $insertVal;
  }
}

第4步:使用快速排序法进行高效分区排序

目的:利用分治思想,选择一个基准值将数组分为两部分递归排序。适用于大规模数据。

操作说明:可使用标准写法 quickSort($left,$right,&$arr),通过双指针向中间收缩交换元素;或使用第二种实现 quickSort2($arr,$order='asc'),该方法支持指定升序(asc)或降序(desc),通过递归合并左右子数组。

<?php
//标准写法
function quickSort($left,$right,&$arr){
   $l=$left;
   $r=$right;
   $pivot= $arr[($left+$right)/2];
   while($l<$r){
     while($arr[$l]<$pivot){ $l++; }
     while($arr[$r]>$pivot){ $r--; }
     if($l>=$r){ break; }
     $temp=$arr[$l];
     $arr[$l]=$arr[$r];
     $arr[$r]=$temp;
     if($arr[$l]==$pivot){ --$r; }
     if($arr[$r]==$pivot){ ++$l; }
   }
   if($l==$r){ $l++; $r--; }
   if($left<$r) quickSort($left,$r,$arr);
   if($right>$l) quickSort($l,$right,$arr);
}

//支持升降序的写法
function quickSort2($arr,$order = 'asc'){
 if(count($arr) <= 1)
  return $arr;
 $arr_left = $arr_right = array();
 $val = $arr[0];unset($arr[0]);
 foreach ($arr as $v) {
  if(strtolower($order) == 'desc'){
   if($v < $val) $arr_right[] = $v;
   else $arr_left[] = $v;
  }else{
   if($v > $val) $arr_right[] = $v;
   else $arr_left[] = $v;
  }
 }
 $arr_left = quickSort($arr_left,$order); //注意此处需确保递归调用正确,原稿可能存在逻辑嵌套差异,建议统一使用quickSort2内部递归或修正
 $arr_right = quickSort2($arr_right,$order);
 return array_merge($arr_left,array($val),$arr_right);
}

PHP查找算法实现

第5步:使用顺序查找检测元素是否存在

目的:在不要求数组有序的情况下,线性遍历查找目标值。

操作说明:调用 search(&$arr,$findVal)。遍历数组,若发现相等元素则输出下标并可选退出;若遍历完未找到,输出“查无此数”。

<?php
function search(&$arr,$findVal){   
  $flag=false;
  for($i=0;$i<count($arr);$i++){
    if($findVal==$arr[$i]){
      echo "找到了,下标为=$i";
      $flag=true;
      //如需单次查找可添加 break;
    }
  }
  if(!$flag){
    echo "查无此数";
  }
}

第6步:使用二分查找提高有序数组检索速度

前提条件:查找数组必须是有序的。

目的:通过折半比较,每次排除一半数据,显著降低查找时间复杂度。

操作说明:调用 binarySearch(&$arr,$findVal,$leftIndex,$rightIndex)。计算中间下标 $middleIndex,若目标值大于中间值则在右半部分继续查找,小于则在左半部分,相等则返回下标。若左右索引交错则判定不存在。

<?php
$arr=array(0,90,900,99990);
binarySearch($arr,90,0,count($arr)-1);

function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
  if($rightIndex < $leftIndex){
    echo "找不到该数";
    return;
  }
  $middleIndex=round(($rightIndex+$leftIndex)/2);
  if($findVal > $arr[$middleIndex]){
    binarySearch($arr,$findVal,$middleIndex+1,$rightIndex);
  }else if($findVal < $arr[$middleIndex]){
    binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
  }else{
    echo "找到这个数。下标是$middleIndex";
  }
}

以上就是PHP常用的排序和查找算法实现的详细内容,更多关于PHP算法设计的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表