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 相关文章推荐
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
php 归并排序 数组交集
May 10 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 PHP
Yii中CGridView关联表搜索排序方法实例详解
Dec 03 PHP
PHP使用Pear发送邮件(Windows环境)
Jan 05 PHP
PHP文件上传类实例详解
Apr 08 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
PHP实现文字写入图片功能
Feb 18 PHP
PHP常见字符串操作函数与用法总结
Mar 04 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编程开发“虚拟域名”系统
2006/10/09 PHP
PHP 危险函数解释 分析
2009/04/22 PHP
PHP JSON格式数据交互实例代码详解
2011/01/13 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
新手如何快速理解js异步编程
2019/06/24 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
Python pandas用法最全整理
2019/08/04 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
Python表达式的优先级详解
2020/02/18 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
青年文明号事迹材料
2014/01/18 职场文书
英语故事演讲稿
2014/04/29 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
英语辞职信范文
2015/02/28 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
Python闭包的定义和使用方法
2022/04/11 Python