使用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版(4)
Oct 09 PHP
PHP提取中文首字母
Apr 09 PHP
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
php数组去重复数据示例
Feb 25 PHP
PHP中多维数组的foreach遍历示例
Jun 13 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHPCMS的使用小结
2010/09/20 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python单例模式实例分析
2015/04/08 Python
python二分查找算法的递归实现方法
2016/05/12 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python调试神器PySnooper的使用
2019/07/03 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python实现邮件自动发送
2019/08/10 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
大二自我鉴定范文
2013/10/05 职场文书
妇女工作先进事迹
2014/08/17 职场文书
见习报告的格式
2014/10/31 职场文书
实名检举信范文
2015/03/02 职场文书
工作态度不好检讨书
2015/05/06 职场文书
院系推荐意见
2015/06/05 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
Python实现老照片修复之上色小技巧
2021/10/16 Python
Java中的随机数Random
2022/03/17 Java/Android