免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7820 | 回复: 7
打印 上一主题 下一主题

PHP常用的四种排序方法及二种查找方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-07 14:03 |只看该作者 |倒序浏览
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
2 [报告]
发表于 2015-08-08 21:37 |只看该作者
回复 1# gfsuper
都是些最基本的算法,不过这一句一般不这么写   for($i=1;$i<count($arr);$i++)
count($arr)一般是一个固定的值,所以可以在之前计算出来,这样可以避免在每次循环结束时都重复计算$attr的长度。
如果$attr是一个结构并不简单而且长度不短的数组,这么写可以提高效率
参考
$cnt = count($attr);
for($i=0; $i < $cnt; $i++)
{
    ...
}

   

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
3 [报告]
发表于 2015-08-09 18:49 来自手机 |只看该作者
现在感觉cpp程序员没有什么优势了,因为php的同学也会二次查找

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
4 [报告]
发表于 2015-08-09 18:49 来自手机 |只看该作者
现在感觉cpp程序员没有什么优势了,因为php的同学也会二次查找

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
5 [报告]
发表于 2015-08-10 18:00 |只看该作者
回复 4# shang2010

php用得上二次查找吗?LZ?
   

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
6 [报告]
发表于 2015-08-10 19:27 |只看该作者
是二分查找,呵呵

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
7 [报告]
发表于 2015-08-10 20:02 |只看该作者
回复 6# shang2010

php用得上二分查找吗?LZ?
   

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
8 [报告]
发表于 2015-08-10 22:28 |只看该作者
我是小白,学php能玩二分查找,感觉很了不起啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP