使用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连接Oracle数据库
Oct 09 PHP
第八节--访问方式
Nov 16 PHP
PHP语法速查表
Jan 02 PHP
mysql5详细安装教程
Jan 15 PHP
了解Joomla 这款来自国外的php网站管理系统
Mar 11 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 PHP
Laravel实现短信注册的示例代码
May 29 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
Zend Guard使用指南及问题处理
2015/01/07 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
python使用cookielib库示例分享
2014/03/03 Python
Python numpy 点数组去重的实例
2018/04/18 Python
Python列表解析配合if else的方法
2018/06/23 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
详解Python中的Lock和Rlock
2021/01/26 Python
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
室内设计专业学生的自我评价分享
2013/11/27 职场文书
银行存款证明样本
2014/01/17 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
生产文员岗位职责
2014/04/05 职场文书
供货协议书
2014/04/22 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书