算法-二分法查找 (Java 實現)


什么是二分法查找

二分查找也稱折半查找(BinarySearch),它是一種采用分治策略的算法,他將問題分解為規模更小的的子問題,分而治之,逐一解決。采用二分法查找的前提條件是:要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列。

二分法查找使用場景

二分法查找適用於數據量較大時,但是數據需要先排好順序。對於我們很多人來說,還是用於面試……

二分法查找算法設計

設排序元素序列(升序)存儲在 arrs 數組,begin、end 指定查找范圍,keyword 是指定查找的值。

  1. 每次從子序列中間 mid 開始比較 mid = (begin + end) / 2,如果 keyword 與 arrs[mid] 元素相等,則查找成功;否則根據根據 keyword 大小縮小查找范圍,若 keyword 較小,則繼續在子序列前半段 begin ~ (mid - 1) 查找;反之在后半段 (mid - 1) ~ end查找。
  2. 重復 1,直到查找成功,當 begin、end 表示范圍失效時,返回 -1 表示查找失敗。

時間復雜度

最快:O(1)
最壞:O(logn)
平均時間復雜度:O(logn)

Java 實現

循環實現

/**
 * 二分查找
 * @param arr
 * @param value
 * @return -1 則查找失敗
 */
public static int binarySearch(int[] arr, int value) {
    int begin = 0;
    int end = arr.length - 1;
    int mid;
    while (begin <= end) { // 邊界有效
        mid = (begin + end) / 2; // 計算中界
        if (arr[mid] == value) { // 如果兩個值相等
            return mid;
        } else if (value > arr[mid]) { // value 較小
            begin = mid + 1; //
        } else { // value 較大
            end = mid - 1;
        }
    }
    return -1;
}

遞歸實現

/**
 * 遞歸實現二分法查找
 * @param arr   [排序完成的線性表]
 * @param value [查找的元素]
 * @param begin [從第幾個元素開始]
 * @param end   [數組長度 - 1]
 * @return -1 則查找失敗
 */
public static int binarySearch(int[] arr, int value, int begin, int end) {
    int mid = (begin + end) / 2;
    // 無效邊界
    if (begin > end) {
        return -1;
    }
    if (arr[mid] == value) {
        return mid;
    } else if (value > arr[mid]) { // value 較小 
        begin = mid + 1;
    } else {
        end = mid - 1;
    }
    return binarySearch(arr, value, begin, end);
}


免責聲明!

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



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