PHP二分查找算法示例【递归与非递归方法】


Posted in PHP onSeptember 29, 2016

本文实例讲述了PHP二分查找算法。分享给大家供大家参考,具体如下:

binarySearch

二分查找采用的方法比较容易理解,以数组为例:

① 先取数组中间的值floor((low+top)/2),

② 然后通过与所需查找的数字进行比较,若比中间值大,则将首值替换为中间位置下一个位置,继续第一步的操作;若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作

③ 重复第二步操作直至找出目标数字

比如从1,3,9,23,54 中查找数字23,

首位置为0, 尾位置为4,中间位置就为2 值为9,比23小,则首位置更新为2+1即3;那么接下来中间位置就为(3+4)/2=3,值为23,比较相等即找到

//  非递归算法:
//  $target是要查找的目标 $arr是已经排序好的数组
function binary(&$arr,$low,$top,$target){
    while($low <= $top){
//由于php取商是有小数的,所以向下取整,不过也可不加,数组也会取整
      $mid = floor(($low+$top)/2);
      echo $mid."<br>";
      if($arr[$mid]==$target){
        return $arr[$mid];
      }elseif($arr[$mid]<$target){
        $low = $mid+1;
      }else{
        $top = $mid-1;
      }
    }
    return -1;
}
//  递归算法:
function binaryRecursive(&$arr,$low,$top,$target){
    if($low<=$top){
      $mid = floor(($low+$top)/2);
      if($mid==$target){
        return $arr[$mid];
      }elseif($arr[$mid]<$target){
        return binaryRecursive($arr,$mid+1,$top,$target);
      }else{
        return binaryRecursive($arr,$low,$top-1,$target);
      }
    }else{
      return -1;
    }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php IP及IP段进行访问限制的代码
Dec 17 PHP
php 变量未定义等错误的解决方法
Jan 12 PHP
php中一个完整表单处理实现代码
Nov 10 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
php中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
PHP中的Session对象如何使用
Sep 25 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
PHP快速排序quicksort实例详解
Sep 28 #PHP
PHP实现QQ快速登录的方法
Sep 28 #PHP
PHP自定义错误用法示例
Sep 28 #PHP
PHP构造函数与析构函数用法示例
Sep 28 #PHP
PHP设计模式之工厂模式与单例模式
Sep 28 #PHP
PHP类相关知识点实例总结
Sep 28 #PHP
PHP 闭包详解及实例代码
Sep 28 #PHP
You might like
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
js切换div css注意的细节
2012/12/10 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python模拟登陆实现代码
2017/06/14 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
Python3中exp()函数用法分析
2019/02/19 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
东方电视购物:东方CJ
2016/10/12 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
数据库笔试题
2013/05/09 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
开票员岗位职责
2015/02/12 职场文书
面试通知邮件
2015/04/20 职场文书
2015年保管员工作总结
2015/04/30 职场文书
转正申请报告格式
2015/05/15 职场文书
机械生产实习心得体会
2016/01/22 职场文书