PHP二分法(折半查找)

二分法思想:
首先前提是要查找的数组对象是有序数组,这里以 从小到大为例,
然后所谓折半就是,每次将目标数组一分为二,取出位于数组中间的那个值,这里记为$a[$middle]
$a[$middle]比我们要查找的数,那说明我们要查找的部分位于 $a[$middle]值的右边
从而利用递归再对右侧的数组进行同样的算法,直到结束为止。
反之, $a[$middle]比我们要查找的数,那说明我们要查找的部分位于 $a[$middle]值的左边,
从而利用递归再对右侧的数组进行同样的算法,直到结束为止。
若最终未找到则返回-1;

非递归方法
function Search($arr = array(), $value) {
$left = 0; $right = count($arr)-1;
while($left <= $right) {
$middle = floor(($left + $right) / 2);//数组中间下标
$flag =  $arr[$middle] < $value ? -1 : ($arr[$middle] == $value ? 0 : 1);
switch($flag) {
case -1 : $left = $middle + 1; break;
case 0 : return $middle;
case 1 : $right = $middle-1; break;
}
}
return -1;
}


递归方法
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
echo bSearch($array, 5, 0, count($array)-1);
function Search($arr = array(),$val,$left,$right){
if ($left<$right)
$middle = floor(($left+$right)/2);
$f = $arr[$middle]<$val?-1:($arr[$middle]==$val?0:1);// $a[$middle]比我们要查找的数,则$f为-1,若相等则为0,否则为1
switch ($f){
case -1:return Search($arr, $val, $middle+1, $right);
break;
case 0:return $middle;
break;
case 1:return Search($arr, $val, $left, $middle-1);
   break;
}
}
return -1;
}



猜你喜欢

转载自blog.csdn.net/zhanqixuan22/article/details/51545431