分享

PHP常用的四种排序方法及二种查找方法

 昵称44082851 2017-09-27
PHP 最常用的四种排序方法  冒泡  选择  插入 快速
        二种查找    顺序查找    二分查找
代码
  1. <?php
  2. /**
  3. * PHP最常用的四个排序方法及二种查找方法
  4. * 下面的排序方法全部都通过测试
  5. * auther : soulence
  6. * date : 2015/06/20
  7. */

  8. //PHP冒泡排序法
  9. function bubbleSort(&$arr){
  10.   //这是一个中间变量
  11.   $temp=0;
  12.   //我们要把数组,从小到大排序
  13.   //外层循环
  14.   $flag=false;//这个优化之后效率会很高,一般够用
  15.   for($i=0;$i<count($arr)-1;$i++){
  16.    
  17.       for($j=0;$j<count($arr)-1-$i;$j++){
  18.           //说明前面的数比后面的数大,就要交换
  19.           if($arr[$j]>$arr[$j+1]){
  20.                 $temp=$arr[$j];
  21.                 $arr[$j]=$arr[$j+1];
  22.                 $arr[$j+1]=$temp;
  23.                 $flag=true;
  24.          }
  25.       }
  26.       if(!$flag){
  27.         //已经是有序了
  28.         break;
  29.       }
  30.       $flag=false;
  31.    }
  32. }

  33. //PHP选择排序法   效率比冒泡要高
  34. function selectSort(&$arr){
  35.    $temp=0;
  36.    for($i=0;$i<count($arr)-1;$i++){
  37.        //假设$i就是最小的数
  38.        $minVal=$arr[$i];
  39.        //记录我认为的最小数的下标
  40.        $minIndex=$i;
  41.        for($j=$i+1;$j<count($arr);$j++){
  42.            //说明我们认为的最小值,不是最小
  43.            if($minVal>$arr[$j]){
  44.                  $minVal=$arr[$j];
  45.                  $minIndex=$j;
  46.            }
  47.        }
  48.        //最后交换
  49.        $temp=$arr[$i];
  50.        $arr[$i]=$arr[$minIndex];
  51.        $arr[$minIndex]=$temp;
  52.    }
  53. }

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

  72.    
  73. //快速排序法  第一种写法  不是我实现的
  74. function quickSort($left,$right,&$arr){
  75.      $l=$left;
  76.      $r=$right;
  77.      $pivot= $arr[($left+$right)/2];
  78.      while($l<$r){
  79.          while($arr[$l]<$pivot){
  80.             $l++;
  81.          }
  82.          while($arr[$r]>$pivot){
  83.             $r--;
  84.          }
  85.          if($l>=$r){
  86.             break;
  87.          }
  88.          
  89.          $temp=$arr[$l];
  90.          $arr[$l]=$arr[$r];
  91.          $arr[$r]=$temp;
  92.          if($arr[$l]==$pivot){
  93.             --$r;
  94.          }
  95.          if($arr[$r]==$pivot){
  96.             ++$l;
  97.          }
  98.      }
  99.      if($l==$r){
  100.         $l++;
  101.         $r--;
  102.      }
  103.      if($left<$r) quickSort($left,$r,$arr);
  104.      if($right>$l) quickSort($l,$right,$arr);
  105. }

  106. /**
  107. * 快速排序方法  第二种实现方法  自己实现的
  108. * PHP快速排序方法
  109. * $order asc  小到大  desc大到小  默认是asc
  110. * $order 的值只能为 asc desc 如果乱写一个值也是按asc排序的
  111. */
  112. function quickSort2($arr,$order = 'asc')
  113. {
  114.   if(count($arr) <= 1)
  115.     return $arr;

  116.   $arr_left = $arr_right = array();

  117.   $val = $arr[0];unset($arr[0]);

  118.   foreach ($arr as $v) {
  119.     if(strtolower($order) == 'desc'){
  120.       if($v < $val)
  121.         $arr_right[] = $v;
  122.       else
  123.         $arr_left[] = $v;
  124.     }else{
  125.       if($v > $val)
  126.         $arr_right[] = $v;
  127.       else
  128.         $arr_left[] = $v;
  129.     }
  130.   }

  131.   $arr_left = quickSort($arr_left,$order);
  132.   $arr_right = quickSort($arr_right,$order);

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


  135. //下面是查找
  136. $arr=array(46,90,900,0,-1);
  137. //这是按顺序查询
  138. function search(&$arr,$findVal){     
  139.     $flag=false;
  140.     for($i=0;$i<count($arr);$i++){
  141.         if($findVal==$arr[$i]){
  142.             echo "找到了,下标为=$i";
  143.             $flag=true;
  144.             //查询一次,如果多次就不要这个 break;
  145.         }
  146.     }
  147.     if(!$flag){
  148.         echo "查无此数";
  149.     }
  150. }

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

  154. //二分查找函数,它有一个前提,查找的数组必须是有序的
  155. function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
  156.     //如果$rightIndex < $leftIndex条件成立,说明没有这个数,则退出
  157.     if($rightIndex < $leftIndex){
  158.         echo "找不到该数";
  159.         return;
  160.     }
  161.     //首先找到中间这个数  round是出于如果出现小数,四舍五入
  162.     $middleIndex=round(($rightIndex+$leftIndex)/2);
  163.     //如果大于则向后面找
  164.     if($findVal > $arr[$middleIndex]){
  165.         binarySearch($arr,$findVal,$middleIndex+1,$rightIndex);
  166.         //如果小于中间数,则向前面找
  167.     }else if($findVal < $arr[$middleIndex]){
  168.         binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
  169.     }else{
  170.         echo "找到这个数。下标是$middleIndex";
  171.     }
  172. }

  173. ?>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多