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 分库分表hash算法
Nov 12 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
PHP调用接口API封装的例子
Oct 11 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
Gird事件机制初级读本
2007/03/10 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
一个javascript参数的小问题
2008/03/02 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
python进阶教程之循环对象
2014/08/30 Python
python实现爬虫下载美女图片
2015/07/14 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Python基于当前时间批量创建文件
2020/05/07 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
python操作toml文件的示例代码
2020/11/27 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
理工大学毕业生自荐信
2013/11/01 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
读书月活动方案
2014/05/22 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
小学教师教学随笔
2015/08/14 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
python lambda 表达式形式分析
2022/04/03 Python