二分查找算法

二分查找算法的前提:

1,针对的是索引数组;

2,针对的是已经排好序的数组;

 

<?php
//二分查找算法:
//二分查找算法的前提:
//1,针对的是索引数组;
//2,针对的是已经排好序的数组;
$a = array(1, 3,  11,  18,  19, 22,25, 33, 34, 38, 44, 55, 56,58, 60,61, 66, 70, 77, 88, 90, 91, 93, 95, 98);
$search = 33;    //要找的数据
$len = count($a);    //数量,自然,最大下标是len-1

//函数功能:从数组$arr中的位置$begin开始到位置$end之间找数据$s
function binary_search($arr, $s, $begin, $end){
    $mid = floor(($begin+$end)/2);    //定位中间的位置
    $mid_value = $arr[$mid];    //取得中间项的值;
    if($mid_value == $s){
        return true;
    }
    else if($mid_value > $s){
        if($begin > $mid-1){//如果开始位置都比结束位置大了,表示肯定找不到了
            return false;
        }
        //中间项比要找的$s大,就去左边找吧:
        $re = binary_search($arr, $s, $begin, $mid-1);
    }
    else{
        if($mid+1 > $end){//如果开始位置都比结束位置大了,表示肯定找不到了
            return false;
        }
        //中间项比要找的$s小,就去右边找吧:
        $re = binary_search($arr, $s, $mid+1, $end);
    }
    return $re;
    
}

//使用binary_search()函数从$a中的0到len-1位置找$search
$v1 = binary_search($a, $search, 0, $len-1);
echo "结果为:"; var_dump($v1);
?>

有关二分查找算法的效率(性能)问题的一点说明:

1000个数据,约10次找出;

100万个数据,约20次找出;

10亿个数据,约30次找出

40亿个数据,约32次找出

posted @ 2017-05-26 19:35  Howie_Tang  阅读(234)  评论(0编辑  收藏  举报