PHP如何查找一列有序數組是否包含某值(二分查找)

問題:對於一列有序數組,如何判斷給出的一個值,該值是否存在於數組。數組

 

思路:判斷是否存在,最簡單是,直接循環該數組,對每個值進行比較。可是對於有序數組來講,這樣寫就徹底沒有利用好「有序」這一特色。spa

   全部咱們使用到「二分法查找」,3d

//有序數組爲
$arr = array(2,5,66,87,954,1452,5865);
//查找值
$str = 1452;
//咱們先定義 三個參數
$front = 0;//一個開始值下標
$end = count($arr) - 1;//一個結束值下標
$mid = intval(($front + $end) / 2);//中間值下標

一、第一次比較,咱們直接判斷查找值str是否等於中間值mid,若是等於 直接返回 true;code

二、若是查找值str大於中間值mid,則說明查找值str可能在中間值的右邊,即對開始值front需從新賦值 = 中間值mid + 1,結束值end不用變,依次中間值mid爲新的開始值 + 結束值;blog

三、若是查找值str小於中間值mid,則說明查找值str可能在中間值的左邊,即開始值不用變,結束值end需從新賦值 = 中間值 - 1,依次中間值mid爲開始值 + 新的結束值;io

-----如上,對於傳入的開始值,結束值,中間值,進行比較。一旦開始值 大於 結束值 則說明沒有找到,結束查詢,反之等於就返回已找到。function

 

具體代碼以下:class

$str = 89;//查找值
$arr = [1,55,66,89,420];//有序數組
$ren = find($arr, $str);

echo '<pre>';
var_dump($ren);

function find($arr, $str){
    $front = 0;//開始下標
    $end = count($arr) - 1;//結束下標
    while($front <= $end){//結束值 大於 開始值 ,反之則退出
        $mid = intval(($front + $end) / 2);//中間值下標
        if($str == $arr[$mid]){
            return $mid;//存在直接返回值的下標
        }
        if($str > $arr[$mid]){
            $front = $mid + 1;//在前面
        }
        if($str < $arr[$mid]){
            $end = $mid - 1;//在後面
        }
    }
    return false;
}

返回結果:89爲第四個元素值下標3循環

相關文章
相關標籤/搜索