算法之查找(折半查找[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;
}

 

posted @ 2013-07-28 18:10  venid  阅读(5079)  评论(0编辑  收藏  举报