使用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写的serv-u的web申请账号的程序
Oct 09 PHP
php5数字型字符串加解密代码
Apr 24 PHP
php 文件上传系统手记
Oct 26 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
php实现阳历阴历互转的方法
Oct 28 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 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下实现农历日历的代码
2007/03/07 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
详解Python3中yield生成器的用法
2015/08/20 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
全球在线商店:BerryLook
2019/04/14 全球购物
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
元旦晚会感言
2014/03/12 职场文书
党员公开承诺书
2014/03/25 职场文书
大学生活自我评价
2014/04/09 职场文书
《分一分》教学反思
2014/04/13 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
检讨书模板
2015/01/29 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
什么是css原子化,有什么用?
2022/04/24 HTML / CSS