二分查找源码和时间复杂度分析

递归解法

/**
 * 二分查找————递归
 * @param array $arr
 * @param $num
 * @return int
 */
function binarySearch(array $arr, $num) {
    $length = count($arr);
    if(0 == $length) {
        return -1;
    }

    return binarySearchInternally($arr, $num, 0, $length - 1);
}

function binarySearchInternally(array $arr, $num, $l, $r) {
    if($l > $r) {
        return -1;
    }

    $midIndex = $l + intval(($r - $l) / 2); //左中间点

    $midData = $arr[$midIndex];
    if($num == $midData) {
        return $midIndex;
    }else if($num < $midData) {
        return binarySearchInternally($arr, $num, 0, $midIndex - 1);
    }else {
        return binarySearchInternally($arr, $num,$midIndex + 1, $r);
    }
}

循环解法

/**
 * 二分查找————非递归
 * @param array $arr
 * @param $num
 * @return int
 */
function binarySearch2(array $arr, $num) {
    $length = count($arr);
    $left = 0;
    $right = $length - 1;

    while($left <= $right) {
        $midIndex = $left + intval(($right - $left) / 2);
        $midData = $arr[$midIndex];

        if($midData == $num) {
            return $midIndex;
        }else if($midData < $num) {
            $left = $midIndex + 1;
        }else{
            $right = $midIndex - 1;
        }
    }
    return -1;
}

时间复杂度分析

由于二分查找每次将数据分为一半,即:
n,n/2,n/4,…,n/(2^k)
每一次只需要一次比较,因此时间复杂度就是O(k),k为要查找的次数,n/(2^k)=1,得到k=logn,因此二分查找的时间复杂度为O(logn)。

发布了243 篇原创文章 · 获赞 87 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/IT_10/article/details/103440269