二分查找

原理

又称为折半查找,必须在有序数组中进行查找。可分为递归方法和非递归方法两种。二分查找查询速度最快。

过程

  1. 确定数组的中建位置mid=(low/high)/2。
  2. 用要查找的数值与中间值比较:若相等,则查找成功;若小于,则继续在左半部分查找;若大于,则继续在右半部分查找。
  3. 重复上面步骤直到找到位置,未找到则表明不存在。

代码

//递归方法
//$arr待查找数组,$key要查找的数,$start区间开始值,$end区间结束值
function binary_search1($arr, $key, $start, $end){
    //以区间中间点作为参照进行比较
    $middle = intval(($start+end)/2);
    //开始值大于结束值退出
    if($start > $end){
        return -1;
    }
    if($key > $arr[$middle]){
        //要找的数比中间值大,那么从区间右边继续查找
        return binary_search1($arr, $key, $middle+1, $end);
    }else if($key < $arr[$middle]){
        //要找的数比中间值小,那么从区间左边继续查找
        return binary_search1($arr, $key, $start, $middle-1);
    }else{
        return $middle;
    }
}

//非递归方法
function binary_search2($arr, $key){
    //非数组或数组为空,直接返回-1
    if(!is_array($arr) || empty($arr)){
        return -1;
    }
    $len = count($arr);
    $start = 0;
    $end = $len - 1;
    while($start <= $end){
        //以中间值作为参考进行比较
        $middle = intval(($start + $end)/2);
        if($key < $arr[$middle]){
            $end = $middle - 1;
        }else if($key > $arr[$middle]){
            $start = $middle + 1;
        }else{
            return $middle;
        }
    }
    return -1;
}

时间复杂度

O(log2n)

空间复杂度

迭代:O(1)

递归:O(log2n)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值