二分法(dichotomie) 即一分為二的方法. 設[a,b]為R的閉區間. 逐次二分法就是造出如下的區間序列([an,bn]):a0=a,b0=b,且對任一自然數n,[an+1,bn+1]或者等於[an,cn],或者等於[cn,bn],其中cn表示[an,bn]的中點.
例子1
header('Content-Type: text/html; charset=utf-8;');
$arr = array(2,33,22,1,323,321,28,36,90,123);
sort($arr);
//二分法尋找
echo $index = binarySearch($arr,321);
function binarySearch($arr,$key){
$len = count($arr);
$mid = -1;
$start = 0;
$end = $len-1;
while($start<=$end){
$mid = (int)(($start+$end)/2);
echo $mid."\n";
if($arr[$mid] == $key){
return $mid;
}else if($arr[$mid] < $key){
$start = $mid+1;
}else if($arr[$mid] > $key){
$end = $mid-1;
}
}
}
例子2
<?php
//search函數 其中$array為數組,$k為要找的值,$low為尋找範圍的最小索引值,$high為尋找範圍的最大索引值
function search($array, $k, $low=0, $high=0)
{
if(count($array)!=0 and $high == 0) //判斷是否為第一次調用
{
$high = count($array);
}
if($low <= $high) //如果還存在剩餘的數組元素
{
$mid = intval(($low+$high)/2); //取$low和$high的中間值
if ($array[$mid] == $k) //如果找到則返回
{
return $mid;
}
elseif ($k < $array[$mid]) //如果沒有找到,則繼續尋找
{
return search($array, $k, $low, $mid-1);
}
else
{
return search($array, $k, $mid+1, $high);
}
}
return -1;
}
$array = array(4,5,7,8,9,10); //測試search函數
echo search($array, 8); //調用search函數並輸出尋找結果
?>