版权声明:转发原创文章请复制文章链接地址 https://blog.csdn.net/weixin_42579642/article/details/85760054
最近有同事问二分法查询,表示不太懂,上网查了下资料,写了个小demo
首先这个算法要满足的是,改数组一定是有序的,否则无效!
/**
* 二分法查找(递归)
*/
function search($arr,$num,$start=0,$end = -1){
//给结束的默认值
if($end == -1){
$end = count($arr) - 1;
}
//找出中间的数的下标
$key = ceil(($start+$end)/2);
if($arr[$key] == $num){
return $key;
}
if($num < $arr[$key]){
$end = $key - 1;
}else{
$start = $key + 1;
}
if($start > $end){
return false;
}
return search($arr,$num,$start,$end);
}
/**
* @param $arr
* @param $num
* @param int $start
* @param int $end
* @return bool|float
* 二分法查询(非递归)
*/
function search2($arr,$num,$start=0,$end=-1){
//给结束的默认值
if($end == -1){
$end = count($arr) - 1;
}
//当开始值小与等于结束值的时候走循环
while($start <= $end){
//找出中间的数的下标
$key = ceil(($start+$end)/2);
if($num == $arr[$key]){
return $key;
}
if($num < $arr[$key]){
$end = $key - 1;
}else{
$start = $key + 1;
}
}
return false;
}
$arr = [1,3,4,6,8,9,10,28,36];
echo search($arr,3);