算法之查找(折半查找[c++版])


查找就是在一系列數據中尋找指定的數據,有順序查找折半查找(又叫二分法查找),順序查找是將這系列數據從頭至尾的遍歷一次,挨個的比較,較費時,但不要求數據有序的,而折半查找則要求數據是有序的,因為它先將要查找的數與序列中中間的那個數比較,假定序列是升序的,那么如果查找的數大於中間的數,則只需要在序列的右半部分找,再將右半部分序列中間的數與查找數比較,依次類推。。,如果找到就返回它的順序,沒找到就返回-1.

下面用c++來實現(假定序列是從小到大的升序):

int bsearch(const int* arr, const int& len, const int& data)
{
    int l = 0;
    int r = len-1;
    int mid = 0;
    while(l <= r)
    {
        mid = l + (r-l)/2;
        if(arr[mid] > data)
            r = mid-1;
        else if(arr[mid] < data)
            l = mid+1;
        else
            return mid;
    }
    return -1;
}

我們來測試一下:

#include <iostream>
using namespace std;

int bsearch(const int* arr, const int& len, const int& data);

int main(int argc, char* argv[])
{
    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 0)<<endl;
    cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 9)<<endl;
    cout<<"bsearch(arr, 10, 0) "<<bsearch(arr, 10, 10)<<endl;
    
    return 0;
}

結果就是:

下面用模板實現一個泛型的版本:

template<typename T>
int bsearch(const T* arr, const int& len, const T& data)
{
    int l = 0;
    int r = len-1;
    int mid = 0;
    while(l <= r)
    {
        mid = l + (r-l)/2;
        if(*(arr+mid) > data)
            r = mid - 1;
        else if(data > *(arr+mid))
            l = mid + 1;
        else
            return mid;
    }
    
    return -1;
}

 


免責聲明!

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



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