1. 程式人生 > >C++ 二分查詢(折半查詢、Binary Search)演算法

C++ 二分查詢(折半查詢、Binary Search)演算法

思路:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;

             否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一

            子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為

            止,此時查詢不成功。

一、非遞迴實現:

#include <iostream>

// 二分查詢:如果查詢到,就返回在陣列中的下標,否則返回-1
int searchBin(int arr[], int len, int x) {
    int low, high, mid;
    
    low = 0;
    high = len - 1;
    while(low <= high) {
        mid = (low + high) / 2;
        if(x == arr[mid])
            return mid;
        else if(x < arr[mid])
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化陣列
    int len, x, loc; // len儲存陣列的實際長度,x要查詢的數, loc位置
    
    len = sizeof(arr) / sizeof(arr[0]); // 整個陣列長度
    // 獲取陣列的實際長度:while(arr[i] != '\0') {count++}
    std::cout << "請輸入要查詢的數:\n";
    while(std::cin >> x) {
        loc = searchBin(arr, len, x); // 呼叫二分查詢函式
        if(loc >= 0)
            std::cout << "在陣列中找到了" << x << ",在陣列中是第" << (loc + 1) << "個。\n";
        else
            std::cout << "在陣列中找不到" << x << std::endl;
        std::cout << "請繼續輸入要查詢的數:\n";
    }
    return 0;
}

二、遞迴實現:

#include <iostream>

// 二分法:遞迴
int searchBin(int arr[], int x, int low, int high) {
    int mid;
    
    if(low > high)
        return -1;
    mid = (low + high) / 2;
    if(x == arr[mid])
        return mid;
    else if(x < arr[mid])
        return searchBin(arr, x, low, mid-1);
    else
        return searchBin(arr, x, mid+1, high);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化陣列
    int len, x, loc; // len儲存陣列的實際長度,x要查詢的數, loc位置

    len = sizeof(arr) / sizeof(arr[0]); // 整個陣列長度
    std::cout << "請輸入要查詢的數:\n";
    while(std::cin >> x) {
        loc = searchBin(arr, x, 0, len-1); // 呼叫二分查詢函式
        if(loc >= 0)
            std::cout << "在陣列中找到了" << x << ",在陣列中是第" << (loc + 1) << "個。\n";
        else
            std::cout << "在陣列中找不到" << x << std::endl;
        std::cout << "請繼續輸入要查詢的數:\n";
    }
    return 0;
}