使用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 阴历-农历-转换类代码
Jan 16 PHP
php 判断数组是几维数组
Mar 20 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php下获取http状态的实现代码
May 09 PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 PHP
教大家制作简单的php日历
Nov 17 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
PHP+Ajax 检测网络是否正常实例详解
Dec 16 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
PHP goto语句用法实例
Aug 06 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
CI(CodeIgniter)框架配置
2014/06/10 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
python的id()函数介绍
2013/02/10 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
wxPython实现分隔窗口
2019/11/19 Python
Python如何读写CSV文件
2020/08/13 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
外贸学院会计专业应届生求职信
2013/11/14 职场文书
幼儿教师研修感言
2014/02/12 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
食品安全承诺书
2014/05/22 职场文书
中考标语大全
2014/06/05 职场文书
节水口号标语
2014/06/19 职场文书
2015年检验科工作总结
2015/04/27 职场文书
田径运动会通讯稿
2015/07/18 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
通过Python把学姐照片做成拼图游戏
2022/02/15 Python