PHP二分查找(递归和循环)

二分查找可以通过递归和循环来实现,

思路如下:

  将要查找的数和中间数进行比较,

  如果相等,则表示找到,返回下标

  如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等于middle-1,直接等于middle,如果查找不到,会造成死归,

  如果要查找的数大于中间这个数,则说明要查找的数分布在数组的右边,修改left边界,使其等于middle+1,直接等于middle,如果查找不到,也会造成死归,

  递归查找,使用一个静态变量保存下标,

  没有查到,则返回-1

  代码如下:

  

 1 //递归二分查找
 2 
 3 function binarySearchByRecursion($arr,$val,$left,$right){
 4     static $index = -1;
 5     
 6     if($left>$right){
 7         return $index;
 8     }
 9     $middle = floor(($left+$right)/2);
10 
11     if($val < $arr[$middle]){
12         //如果$middle不-1,则挑不出去,会一直递归下去
13         $right = $middle-1;
14         binarySearchByRecursion($arr,$val,$left,$right);
15     }elseif($val > $arr[$middle]){
16         $left = $middle+1;
17         binarySearchByRecursion($arr,$val,$left,$right);
18     }else{
19         $index = $middle;
20     }
21     return $index;
22 }
23 
24 //循环二分查找
25 //
26 function binarySearchByLoop($arr,$val){
27     $index = -1;
28     $left = 0;
29     $right = count($arr)-1;
30     
31     while($left <= $right ){
32 
33         $middle = round(($left+$right)/2);
34         if($val < $arr[$middle]){
35             $right = $middle - 1;
36         }elseif($val > $arr[$middle]){
37             $left = $middle + 1;
38         }else{
39             $index = $middle;
40             break;
41         }
42     }
43     return $index;
44 }

 

posted @ 2016-11-23 19:36  少年飞刀  阅读(471)  评论(0编辑  收藏  举报