PHP實現二分查找算法


 

 

二分查找

  二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列。

  首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

 

 

使用循環方式實現二分查找

/**
 * 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常簡單,有點類似分治的思想。
 * 二分查找針對的是一個有序的數據集合,每次都通過跟區間的中間元素對比,
 * 將待查找的區間縮小為之前的一半,直到找到要查找的元素,或者區間被縮小為 0。
 *
 * 循環寫法
 * @param array $array      待查找的數組
 * @param int $findVal      要查找的值
 * @return int              返回找到的數組鍵
 */
function binarySearch($array, $findVal)
{
    // 非數組或者數組為空,直接返回-1
    if (!is_array($array) || empty($array)) {
        return -1;
    }
    // 查找區間,起點和終點
    $start = 0;
    $end = count($array) - 1;
    while ($start <= $end) {
        // 以中間點作為參照點比較,取整數
        $middle = intval(($start + $end) / 2);
 
        if ($array[$middle] > $findVal) {
            // 查找數比參照點小,則要查找的數在左半邊
            // 因為 $middle 已經比較過了,這里需要減1
            $end = $middle - 1;
 
        } elseif ($array[$middle] < $findVal) {
            // 查找數比參照點大,則要查找的數在右半邊
            // 因為 $middle 已經比較過了,這里需要加1
            $start = $middle + 1;
 
        } else {
            // 查找數與參照點相等,則找到返回
            return $middle;
        }
    }
    // 未找到,返回-1
    return -1;
}
 
// 調用
$array = [10,12,16,19,20,34,56,78,84,95,100];
echo binarySearch($array, 84);

 

 

使用遞歸方式實現二分查找

/**
 * 遞歸寫法
 * @param array $array  待查找的數組
 * @param int $findVal  要查找的值
 * @param int $start    查找區間,起點
 * @param int $end      查找區間,終點
 * @return int          返回找到的數組鍵
 */
function binarySearch($array, $findVal, $start, $end)
{
    // 以中間點作為參照點比較,取整數
    $middle = intval(($start + $end) / 2);
    if ($start > $end) {
        return -1;
    }
    if ($findVal > $array[$middle]) {
        // 查找數比參照點大,則要查找的數在右半邊
        return binarySearch($array, $findVal, $middle + 1, $end);
 
    } elseif ($findVal < $array[$middle]) {
        // 查找數比參照點小,則要查找的數在左半邊
        return binarySearch($array, $findVal, $start, $middle - 1);
 
    } else {
        return $middle;
    }
}
 
// 調用
$array = [10,12,16,19,20,34,56,78,84,95,100];
echo binarySearch($array, 95, 0, count($array)-1);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM