二分查詢法(Binary_Search)

ice_moss發表於2021-05-19

一.介紹

二分查詢法是一種在計算機中快速查詢相應內容的演算法,它基於有序陣列將其查詢,在計算機中廣泛使用,已經成為計算機中必不可少的演算法,二分查詢: 又稱為 折半查詢,二分查詢,適合對已經排序好的資料集合進行查詢,時間複雜度O(log2n),效率高。

二.邏輯

假設有一升序的資料集合{0, 1, 2, 3, 4, 5, 6, 7, 8}先找出升序集合中最中間的元素mid = 4,將資料集合劃分為兩個子集,將最中間的元素mid = 4和關鍵字key進行比較,如果等於key則返回,如果大於關鍵字key,則在前一個資料集合中查詢,否則在後一個子集中查詢,直到找到為止,如果沒找到則返回-1

例如:

{0, 1, 2, 3, 4, 5, 6, 7, 8},我們需要查詢元素3,第一次會把該陣列一分為二

找到最中間的數mid = 4;將mid和3比較,此時發現mid > 3;所以會進入陣列{0, 1, 2, 3,}(一共4個元素,我們需要找到索引(r+l)/2 的元素1.5,我們將其設定為整型所以就是查詢到1)然後將mid = 1和3比較,此時mid < 3,所以會進入{2, 3}

仍然是mid =(r+l) / 2 ,最後就找到了元素3。

三.程式碼

下面用c++程式碼實現

#include<iostream>
using namespace std;
//使用模板函式
template <typename T >
//將索引為target的元素arr[target]
int BinraySearch(T arr[], int n, int target){
    int l = 0;
    int r = n - 1;
    while(l<=r) {
        //int mid = (l+r)/2;一分為二,但是這裡可能存在溢位,所以用下面的最佳化版本
        int mid = l - (l + r) / 2;
        if (arr[target] == arr[mid]) {
            return mid;
        }
        else if (arr[target] > arr[mid]) {
            r = mid + 1;
        }
        else  //arr[target] < arr[mid];
            l = mid - 1;
    }
  //如果查詢元素不存在,則返回-1
    return -1;
}

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章