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 相关文章推荐
一个可查询所有表的“通用”查询分页类
Oct 09 PHP
PHP配置心得包含MYSQL5乱码解决
Nov 20 PHP
PHP中cookies使用指南
Mar 16 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
PHP常用的三种设计模式
Feb 17 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 PHP
TP5多入口设置实例讲解
Dec 15 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/11/26 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
vue 实现图片懒加载功能
2020/12/31 Vue.js
python获取代理IP的实例分享
2018/05/07 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
python仿抖音表白神器
2019/04/08 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
使用python实现学生信息管理系统
2021/02/25 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
应届生高等护理求职信
2013/10/12 职场文书
顶碗少年教学反思
2014/02/21 职场文书
网站美工岗位职责
2014/04/02 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
工作检讨书怎么写
2015/01/23 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android