二分查找可以通过递归和循环来实现,
思路如下:
将要查找的数和中间数进行比较,
如果相等,则表示找到,返回下标
如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改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 }