使用PHP实现二分查找算法代码分享


Posted in PHP onJune 24, 2011

第一种方法:
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。


【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。


【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

<?php 
//作者:遥远的期待 
//QQ:15624575 
//主页:http://www.phptogether.com/ 
//正向排序的数组 
$arr=array(1,3,5,7,9,11); 
//逆向排序的数组 
$arr2=array(11,9,7,5,3,1); 
//对正向排序的数组进行二分查找 
function searchpart($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 
if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 
$end=$mid-1;//$arr[0]-$arr[1] 
}elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[3]-$arr[5] 
$start=$mid+1; 
}else{//找到了,返回待查值下标 
return $mid; 
} 
} 
} 
//对逆向排序的数组进行二分查找 
function searchpart2($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//这里只需要保证中间项下标的计算值为整数即可,也可以四舍五入,不影响结果 
if($arr[$mid]>$x){//如果中间项的值大于待查值,说明代差值位于中间项的右边,因此,结束下标不变,起始下标变成中间项下标加1,第一次搜索的是$arr[0]-$arr[5]的话,下一次搜索 
$start=$mid+1;//$arr[3]-$arr[5] 
}elseif($arr[$mid]<$x){//如果中间项的值小于待查值,说明代差值位于中间项的左边,因此,起始下标不变,结束下标变成中间项下标减1,第一次搜索的是$arr[0]-$arr[5]的话,下一//次搜索是,$arr[0]-$arr[1] 
$end=$mid-1; 
}else{//找到了,返回待查值下标 
return $mid; 
} 
} 
} 
echo searchpart2($arr,5).'<br>'; 
echo searchpart2($arr2,5); 
?>

PHP的二分查找算法实现
最近整理了下以前学习的算法知识,虽然在WEB开发时算法用到的情况比较少,但还是把一些有用的算法做下备份。
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
【基本思想】
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
PHP的二分查找算法实现
/** 
* 二分查找算法 
* 
* @param array $arr 有序数组 
* @param int $val 查找的数值 
* @return int 查找值存在返回数组下标,不存在返回-1 
*/ 
function binary_search($arr,$val) 
{ 
$l = count($arr);//获得有序数组长度 
$low = 0; 
$high = $l -1; 
while($low <= $high) 
{ 
$middle = floor(($low + $high) / 2); 
if($arr[$middle] == $val) 
{ 
return $middle; 
} 
elseif($arr[$middle] > $val) 
{ 
$high = $middle - 1; 
} 
else 
{ 
$low = $middle + 1; 
} 
} 
return -1; 
} 
//示例 
$arr = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99); 
echo binary_search($arr,57);
PHP 相关文章推荐
第十四节--命名空间
Nov 16 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP字符串与数组处理函数用法小结
Jan 07 PHP
PHP求最大子序列和的算法实现
Jun 24 #PHP
php中转义mysql语句的实现代码
Jun 24 #PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 #PHP
php中对2个数组相加的函数
Jun 24 #PHP
php判断输入不超过mysql的varchar字段的长度范围
Jun 24 #PHP
PHP array操作10个小技巧分享
Jun 23 #PHP
php 缩略图实现函数代码
Jun 23 #PHP
You might like
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
python for 循环获取index索引的方法
2019/02/01 Python
详解python中list的使用
2019/03/15 Python
python微信撤回监测代码
2019/04/29 Python
Python调用C语言的实现
2019/07/26 Python
python类中super() 的使用解析
2019/12/19 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
自考毕业自我鉴定
2014/03/18 职场文书
交通安全标语
2014/06/06 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书