使用PHP实现二分查找算法代码分享

yipeiwu_com6年前PHP代码库

第一种方法:
【二分查找要求】: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中FTP相关函数小结

本文实例讲述了PHP中FTP相关函数。分享给大家供大家参考,具体如下: <?php set_time_limit(0); //转存本地地址 define( 'STO...

解析PHP强制转换类型及远程管理插件的安全隐患

远程管理插件是目前广受WordPress站点管理员欢迎的实用工具,它允许用户同时对多个站点执行相同的操作,如更新到最新的发行版或安装插件等。但是,为了实现这些操作,客户端插件需要赋予远程...

PHP自带方法验证邮箱是否存在

PHP自带方法验证邮箱是否存在

PHP校验邮箱地址的方法很多, 比较常用的就是自己写正则了, 不过正则多麻烦, 我PHP自带了方法做校验。 filter_var filter_var是PHP内置的一个变量过滤的方法,...

PHP实现的折半查询算法示例

PHP实现的折半查询算法示例

本文实例讲述了PHP实现的折半查询算法。分享给大家供大家参考,具体如下: 什么是折半查询算法?具体文字描述自己百度。直接上代码: <?php header("Conte...

PHP开发入门教程之面向对象

PHP是弱变量的脚本语言,也就是说你无需先定义,这一点很灵活。也可以给予很大的自由度,但对于程序来说,自由并非好事。  因为给予后期维护人员阅读带来很大的麻烦。  下面来进入我们第一个程...