原理
又称为折半查找,必须在有序数组中进行查找。可分为递归方法和非递归方法两种。二分查找查询速度最快。
过程
- 确定数组的中建位置mid=(low/high)/2。
- 用要查找的数值与中间值比较:若相等,则查找成功;若小于,则继续在左半部分查找;若大于,则继续在右半部分查找。
- 重复上面步骤直到找到位置,未找到则表明不存在。
代码
//递归方法
//$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)