使用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 相关文章推荐
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
php算开始时间到过期时间的相隔的天数
Jan 12 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
基于Zend的Config机制的应用分析
May 02 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
PHP输入输出流学习笔记
May 12 PHP
php中文验证码实现方法
Jun 18 PHP
php链表用法实例分析
Jul 09 PHP
PHP中FTP相关函数小结
Jul 15 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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
开发大型PHP项目的方法
2006/10/09 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
php生成二维码
2015/08/10 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python判断字符串是否纯数字的方法
2014/11/19 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python实现SMTP邮件发送
2020/06/16 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
医学专业大学生求职的自我评价
2013/11/27 职场文书
实习生自我评价
2014/01/18 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
python实现语音常用度量方法的代码详解
2021/05/25 Python