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 相关文章推荐
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
PHP内核探索:变量概述
Jan 30 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
php解析xml 的四种简单方法(附实例)
Jul 11 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
PHP函数积累总结
Mar 19 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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
深入PHP curl参数的详解
2013/06/17 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
python批量图片处理简单示例
2019/08/06 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
学习雷锋精神心得体会范文
2014/03/12 职场文书
小露珠教学反思
2014/04/30 职场文书
反邪教警示教育方案
2014/05/13 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
民间借贷借条范本
2015/05/25 职场文书
家庭经济困难证明
2015/06/23 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
详解Django中 render() 函数的使用方法
2021/04/22 Python