二分查找采用的方法比較容易理解,以有序數組為例,
先取數組中間的值floor((low+top)/2),
然后通過與所需查找的數字進行比較,若比中間值大,則將首值替換為中間位置下一個位置,繼續第一步的操作;若比中間值小,則將尾值替換為中間位置上一個位置,繼續第一步操作
重復第二步操作直至找出目標數字
比如從1,3,9,23,54 中查找數字23,
首位置為0, 尾位置為4,中間位置就為2 值為9,比23小,則首位置更新為2+1即3;那么接下來中間位置就為(3+4)/2=3,值為23,比較相等即找到
// 非遞歸
// $target是要查找的目標 $arr是已經排序好的數組
function binary(&$arr,$low,$top,$target){
while($low <= $top){
//由于php取商是有小數的,所以向下取整,不過也可不加,數組也會取整
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
$low = $mid+1;
}else{
$top = $mid-1;
}
}
return -1;
}
$arr = array(1,3,9,23,54);
echo binary($arr, 0, sizeof($arr), 9);
// 遞歸
function binaryRecursive(&$arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$mid-1,$target);
}
}else{
return -1;
}
}
$arr = array(1,3,9,23,54);
echo binaryRecursive($arr, 0, sizeof($arr), 9);