菜niao成长记1 二分查找法

二分查找的思路分析
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 "未找到";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值