二分查找的思路分析
1、首先确定该数组中间的下标 mid=(left +right)/2
2然后让需要查找的数findval和arr[mid]比较
2.1 arr[mid]>findval 说明你要查找的数在mid的左边 ,因此需要递归向左查找
2.2 arr[mid]<findval 说明你要查找的数在mid的右边 ,因此需要递归向右查找
2.3 findval==arr[mid] 说明找到 就返回
什么时候我们需要结束递归
1找到就结束递归
2递归完整个数组 仍然没有到找findval 也需要结束递归 当left>right 就需要退出
$arr=array(10,30,50,70,80,100,120,150,160,170);
var_dump(lookup($arr,50));
function lookup($arr,$search_val){
$left =0;
$right=count($arr)-1;
while($left<=$right){
//第一次递归 left等于0 right等于 9 中间位置mid 为4
//第二次递归 left等于0 right等于 3 中间位置为1
//第三次递归 left等于1 right等于 3 中间位置为2
$mid = intval(($left+$right) /2);
//第一次递归$arr[4]等于80 80大于要查找的数50 说明要查找的数在左边 right等于3
//第二次递归$arr[1]30 30小于要查找的数50 说明要查找的数在右边 left等于1
//第三次递归$arr[2]50 两值相等 返回
if($arr[$mid]>$search_val){
$right=$mid-1;
}elseif($arr[$mid]<$search_val){
$left =$mid+1;
}else{
return $mid;
}
}
return "未找到";
}