faiculty 2020-08-20
<?php
/**
* @param array $arr 递增数字数组
* @param int $number 待查找的数字
* @return int 返回找到的键
*/
function binary_search($arr,$number){
// 非数组或数组为空,返回-1
if(!is_array($arr)||empty($arr)){
return -1;
}
// 初始化变量值
$len = count($arr);
$lower = 0;
$high = $len - 1;
// 最低点比最高点大就退出
while($lower<=$high){
//以中间点作为参照点
$middle = intval(($lower+$high)/2);
if($number < $arr[$middle]){
$high = $middle - 1; // 查找数比参照点小,则舍去右边
}else if ($number > $arr[$middle]){
$lower = $middle + 1; // 查找数比参照点大,则舍去左 边
}else{
return $middle;
}
}
//未找到,返回-1
return -1;
}
$arr = [1,3,5,7,9,11,16,26,27,29,34,35,39,65,97];
$find_key = binary_search($arr,27);
echo ‘$arr[‘.$find_key.‘]=‘.$arr[$find_key];在有序数组中如果用暴力算法查找,也就是阻隔遍历比较,那么时间复杂度是O(n);
但是用二分法查找,每次都会舍弃一般查找区间,所以复杂度是O(logn);