PHP常用的排序和查找算法

本文汇总了常见的PHP排序算法和查找,在进行算法设计的时候有不错的借鉴价值。现分享给大家供参考之用。具体如下:

rush:PHP;"> PHP /** * PHP最常用的四个排序方法及二种查找方法 * 下面的排序方法全部都通过测试 * auther : soulence * date : 2015/06/20 */

//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;
}
}

//PHP选择排序法 效率比冒泡要高
function selectSort(&$arr){
$temp=0;
for($i=0;$i<count($arr)-1;$i++){
//假设$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;
}
}

//插入排序法(小到大排序) 效率又比 选择排序法要高一些
function insertSort(&$arr){
//先认下标为0的这个数已经是有序
for($i=1;$i<count($arr);$i++){
//$insertVal是准备插入的数
$insertVal=$arr[$i];
//准备先和谁下标为$inserIndex的比较
$inserIndex=$i-1;
//如果这个条件满足,说明我们还没有找到适当的位置
while($inserIndex >= 0 && $insertVal < $arr[$inserIndex]){
//同时把数后移
$arr[$inserIndex+1] = $arr[$inserIndex];
$inserIndex--;
}
//插入(这时就给$inserIndex找到适当的位置)
$arr[$inserIndex+1] = $insertVal;
}
}

//快速排序法 第一种写法 不是我实现的
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,$arr);
}

/**

  • 快速排序方法 第二种实现方法 自己实现的
  • PHP快速排序方法
  • $order asc 小到大 desc大到小 认是asc
  • $order 的值只能为 asc desc 如果乱写一个值也是按asc排序的
    */
    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);
$arr_right = quickSort($arr_right,$order);

return array_merge($arr_left,array($val),$arr_right);
}

//下面是查找
$arr=array(46,90,900,-1);
//这是按顺序查询
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 "查无此数";
}
}

//调用二分查找
$arr=array(0,99990);//注意,一定要是有序的
binarySwarch($arr,count($arr)-1);

//二分查找函数,它有一个前提,查找的数组必须是有序的
function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
//如果$rightIndex < $leftIndex条件成立,说明没有这个数,则退出
if($rightIndex < $leftIndex){
echo "找不到该数";
return;
}
//首先找到中间这个数 round是出于如果出现小数,四舍五入
$middleIndex=round(($rightIndex+$leftIndex)/2);
//如果大于则向后面找
if($findVal > $arr[$middleIndex]){
binarySearch($arr,$middleIndex+1,$rightIndex);
//如果小于中间数,则向前面找
}else if($findVal < $arr[$middleIndex]){
binarySearch($arr,$middleIndex-1);
}else{
echo "找到这个数。下标是$middleIndex";
}
}
?>

希望本文所述排序算法和查找算法实例对大家的PHP程序设计有所帮助。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...