您的位置:首页 > 编程语言 > PHP开发

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

2016-12-14 11:05 543 查看
二分查找又称折半查找,它是一种效率较高的查找方法。

第一种方法:

【二分查找要求】: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顺序查找和二分查找示例
php二分查找二种实现示例
PHP常用的排序和查找算法
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
PHP查找与搜索数组元素方法总结
php实现指定字符串中查找子字符串的方法
PHP经典算法集锦【经典收藏】
php 大数据量及海量数据处理算法总结
php编写的抽奖程序中奖概率算法
PHP二分查找算法示例【递归与非递归方法】

Tags:二分查找算法

相关文章

2007-04-04PHP与SQL注入攻击[二]
2010-02-02php foreach 使用&(与运算符)引用赋值要注意的问题
2008-10-10php合并数组array_merge函数运算符加号与的区别
2015-06-06php源码分析之DZX1.5字符串截断函数cutstr用法
2016-07-07php基于PDO连接MSSQL示例DEMO
2012-06-06php 函数中使用static的说明
2016-06-06php英文单词统计器
2016-03-03解读PHP的Yii框架中请求与响应的处理流程
2016-07-07php如何执行非缓冲查询API
2015-02-02php强制更新图片缓存的方法

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: