C++STL二分查找函数集及补充

来源:互联网 发布:苗疆真的有蛊吗 知乎 编辑:程序博客网 时间:2024/06/07 20:59

C++中还是有许多我未了解或者不常用的函数,比如今天写下的一些二分函数,还是挺有用的,不仅仅可以减少代码量,而且能够增加时间的利用率。(目前我只学了简单的数组查找,有待补充)

大概有以下几个STL中的二分查找函数:

    binary_search(a,a+n,key)    //返回是否存在值bool型的    lower_bound(a,a+n,key)      //下面两个都是指针型的    upper_bound(a,a+n,key)    /*升序排列的容器:    lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。    upper_bound( const key_type &key ): 返回一个迭代器,指向键值>key的第一个元素。    //降序排列的容器:    lower_bound( const key_type &key ): 返回一个迭代器,指向键值<= key的第一个元素。    upper_bound( const key_type &key ):返回一个迭代器,指向键值<key的第一个元素。    */
以下介绍一下手工写的二分函数,也可以改成系STL的函数:

一、判断是否存在key值:

bool search(int A[], int n, int target){    int low = 0, high = n-1;    while(low <= high)    {        int mid = low+((high-low)>>1);        if(A[mid] == target)            return true;        else if(A[mid] < target)            low = mid+1;        else            high = mid-1;    }    return false;}
二、存在相同key值时查找最先出现的位置:

//此函数返回的是第几个元素,非数组下标int lower_search(int A[], int n, int target){    int low = 0, high = n-1;    while(low <= high)    {        int mid = low+((high-low)>>1);        if(A[mid] == target)        {            if(mid > 0 && A[mid-1] == target)                high = mid-1;            else                return mid;        }        else if(A[mid] < target)            low = mid+1;        else            high = mid-1;    }    return -(low+1);}

三、存在相同元素的时候,返回最后出现的位置:

//此函数返回的是第几个元素,非数组下标int upper_search(int A[], int n, int target){    int low = 0, high = n-1;    while(low <= high)    {        int mid = low+((high-low)>>1);        if(A[mid] == target)        {            if(mid < n-1 && A[mid+1] == target)                low = mid+1;            else                return mid;        }        else if(A[mid] < target)            low = mid+1;        else            high = mid-1;    }    return -(low+1);}
三、存在多个key值时,返回位置差:

int equal_search(int A[], int n, int target){    int tmp = upper_search(A, n, target)-lower_search(A, n, target);    return tmp;}


0 0
原创粉丝点击