lower_bound和upper_bound算法

参考:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

     lower_bound和upper_bound如下图所示:

1. lower_bound

  这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是采用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。

int lower_bound(int *array int size ,int key)
{
    int first=0,middle;
    int half,len;
    len=size;
    while(len>0)
    {
        half=len>>1;
        middle=first+half;
        if(array[middle]<key)//当中间的数小于key,在右边的子序列查找
        {
            first=middle+1;
            len=len-half-1;
        }
        else len=half;//否则在左边
    }
    return first;
}

2. upper_bound

upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置。

int lower_bound(int *array int size ,int key)
{
    int first=0,middle;
    int half,len;
    len=size;
    while(len>0)
    {
        half=len>>1;
        middle=first+half;
        if(array[middle]<=key)
        {
            first=middle+1;
            len=len-half-1;
        }
        else len=half;
    }
    return first;
}
原文地址:https://www.cnblogs.com/iwantstrong/p/5986003.html