第一種方法: 
【二分查找要求】:1.必須采用順序存儲結構 2.必須按關鍵字大小有序排列。    
【優(yōu)缺點】折半查找法的優(yōu)點是比較次數(shù)少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經(jīng)常變動而查找頻繁的有序列表。    
【算法思想】首先,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。 
復制代碼 代碼如下:
 
<?php 
//作者:遙遠的期待 
//QQ:15624575 
//主頁: 
//正向排序的數(shù)組 
$arr=array(1,3,5,7,9,11); 
//逆向排序的數(shù)組 
$arr2=array(11,9,7,5,3,1); 
//對正向排序的數(shù)組進行二分查找 
function searchpart($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//這里只需要保證中間項下標的計算值為整數(shù)即可,也可以四舍五入,不影響結果 
if($arr[$mid]>$x){//如果中間項的值大于待查值,說明代差值位于中間項的左邊,因此,起始下標不變,結束下標變成中間項下標減1,第一次搜索的是$arr[0]-$arr[5]的話,下一次搜索 
$end=$mid-1;//$arr[0]-$arr[1] 
}elseif($arr[$mid]<$x){//如果中間項的值小于待查值,說明代差值位于中間項的右邊,因此,結束下標不變,起始下標變成中間項下標加1,第一次搜索的是$arr[0]-$arr[5]的話,下一//次搜索是,$arr[3]-$arr[5] 
$start=$mid+1; 
}else{//找到了,返回待查值下標 
return $mid; 
} 
} 
} 
//對逆向排序的數(shù)組進行二分查找 
function searchpart2($arr,$x){ 
$start=0; 
$end=count($arr)-1; 
while($start<=$end){ 
$mid=intval(($start+$end)/2);//這里只需要保證中間項下標的計算值為整數(shù)即可,也可以四舍五入,不影響結果 
if($arr[$mid]>$x){//如果中間項的值大于待查值,說明代差值位于中間項的右邊,因此,結束下標不變,起始下標變成中間項下標加1,第一次搜索的是$arr[0]-$arr[5]的話,下一次搜索 
$start=$mid+1;//$arr[3]-$arr[5] 
}elseif($arr[$mid]<$x){//如果中間項的值小于待查值,說明代差值位于中間項的左邊,因此,起始下標不變,結束下標變成中間項下標減1,第一次搜索的是$arr[0]-$arr[5]的話,下一//次搜索是,$arr[0]-$arr[1] 
$end=$mid-1; 
}else{//找到了,返回待查值下標 
return $mid; 
} 
} 
} 
echo searchpart2($arr,5).'<br>'; 
echo searchpart2($arr2,5); 
?> 
復制代碼 代碼如下:
 
/** 
* 二分查找算法 
* 
* @param array $arr 有序數(shù)組 
* @param int $val 查找的數(shù)值 
* @return int 查找值存在返回數(shù)組下標,不存在返回-1 
*/ 
function binary_search($arr,$val) 
{ 
$l = count($arr);//獲得有序數(shù)組長度 
$low = 0; 
$high = $l -1; 
while($low <= $high) 
{ 
$middle = floor(($low + $high) / 2); 
if($arr[$middle] == $val) 
{ 
return $middle; 
} 
elseif($arr[$middle] > $val) 
{ 
$high = $middle - 1; 
} 
else 
{ 
$low = $middle + 1; 
} 
} 
return -1; 
} 
//示例 
$arr = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99); 
echo binary_search($arr,57); 
| 
 
 | 
新聞熱點
疑難解答