PHP實現二分查找(遞歸與非遞歸)

二分查找采用的方法比較容易理解,以有序數組為例,

先取數組中間的值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);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,440評論 0 5
  • 一、Python簡介和環境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,808評論 0 10
  • 今天,像往常一樣5點多一點我就到托輔去接兒子了,在門外看到了他的托輔老師,跟我說:你兒子今天又闖禍了。我心里嗝...
    荊長睿媽媽閱讀 249評論 0 0
  • 這個暑假過完弟弟就要回老家讀書去了,我已畢業參加工作,今后生活能留給我們姐弟兩個創造美好回憶的時間不多了,于是決定...
    彭彭吃草莓閱讀 348評論 0 0