使用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 获取select下拉列表框的值
May 08 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
PHP三层结构(上) 简单三层结构
Jul 04 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
详解php实现页面静态化原理
Jun 21 PHP
php读取本地json文件的实例
Mar 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
PHP经典面试题集锦
2015/03/19 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
JavaScript中的对象化编程
2008/01/16 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python读写docx文件的方法
2018/05/08 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Python定时器线程池原理详解
2020/02/26 Python
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
勾股定理课后反思
2014/04/26 职场文书
庆六一活动总结
2014/08/29 职场文书
党员作风建设整改方案
2014/10/27 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
工作表扬信
2015/01/17 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
JavaScript实现音乐播放器
2022/08/14 Javascript