时间:2021-07-01 10:21:17 帮助过:4人阅读
- <?php
- //正向排序的数组
- $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中文网!