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新手上路(九)
Oct 09 PHP
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
PHP求小于1000的所有水仙花数的代码
Jan 10 PHP
php cli换行示例
Apr 22 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
Oct 29 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP asXML()函数讲解
Feb 03 PHP
laravel-admin 中列表筛选方法
Oct 03 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 文件上传系统手记
2009/10/26 PHP
php在线代理转向代码
2012/05/05 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
js弹出div并显示遮罩层
2014/02/12 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python中标准模块importlib详解
2017/04/16 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Python 列表反转显示的四种方法
2020/11/16 Python
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
答谢词范文
2015/01/05 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
SQL中的三种去重方法小结
2021/11/01 SQL Server
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
基于Python实现射击小游戏的制作
2022/04/06 Python