使用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.ini中文版
Oct 09 PHP
谈谈关于php的优点与缺点
Apr 11 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
php获取linux命令结果的实例
Mar 13 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
Jun 20 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 PHP
PHP的new static和new self的区别与使用
Nov 27 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
收音机的保养
2021/03/01 无线电
php小偷相关截取函数备忘
2010/11/28 PHP
PHP中用hash实现的数组
2011/07/17 PHP
浅析php创建者模式
2014/11/25 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python实现的ini文件操作类分享
2014/11/20 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
一份软件工程师的面试试题
2016/02/01 面试题
小学教师听课制度
2014/02/01 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
机关作风建设心得体会
2014/10/22 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技