适用于STL容器的泛型二分查找算法

在algorithm文件中有查找的算法,不过它是顺序查找的,它的实现是这样的

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator end, const T& key)
{
    while(first != end)
    {
        if(*first == key)
            return first
        first++;
    }
    return end;
}

下面我们实现一个二分查找的:

template<class InputIterator, class T>
InputIterator bfind(InputIterator first, InputIterator end, const T& key)
{
    InputIterator l = first;
    InputIterator r = end-1;
    InputIterator mid;
    while(l <= r)
    {
        mid = l + distance(l, r)/2;
        if(*mid > key)
            r = mid - 1;
        else if(key  > *mid )
            l = mid + 1;
        else 
            return mid;
    }
    return end;
}

那么我们就可以这样来使用啦,注意容器中的数据一定要是排好序的

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char* argv[])
{
    int arr[]  = {1, 2, 3, 4, 5};
    vector<int> ivec(arr, arr+5);
    vector<int>::iterator iter = bfind(ivec.begin(), ivec.end(), 4);
    if(iter != ivec.end())
        cout<<*iter<<endl;
    else
        cout<<"not find"<<endl;
    return 0;
}

 

posted @ 2013-07-29 10:39  venid  阅读(701)  评论(0编辑  收藏  举报