PHP常用的排序和查找算法


Posted in PHP onAugust 06, 2015

本文汇总了常见的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,$right,$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,0,-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,90,900,99990);//注意,一定要是有序的
binarySwarch($arr,90,0,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,$findVal,$middleIndex+1,$rightIndex);
    //如果小于中间数,则向前面找
  }else if($findVal < $arr[$middleIndex]){
    binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
  }else{
    echo "找到这个数。下标是$middleIndex";
  }
}
?>

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

PHP 相关文章推荐
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
基于php无限分类的深入理解
Jun 02 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
php模拟实现斗地主发牌
Apr 22 PHP
php png失真的原因及解决办法
Oct 24 PHP
PHP处理会话函数大总结
Aug 05 #PHP
PHP实现合并discuz用户
Aug 05 #PHP
举例详解PHP脚本的测试方法
Aug 05 #PHP
使用Thinkphp框架开发移动端接口
Aug 05 #PHP
wampserver改变默认网站目录的办法
Aug 05 #PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 #PHP
PHP合并discuz用户脚本的方法
Aug 04 #PHP
You might like
php5 图片验证码实现代码
2009/12/11 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
css图片自适应大小
2007/11/28 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
三严三实对照检查材料
2014/09/22 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
贪污检举信范文
2015/03/02 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技