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

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值