二分查找

来源:互联网 发布:zayn malik知乎 编辑:程序博客网 时间:2024/04/28 18:31

2012-06-06 22:54:41|  分类: 算法&数据结构|字号 订阅

1、二分查找判断某个数是否存在,若存在返回所在位置,否则返回-1
int bsearch(int* arr, int lhs, int rhs, int value)
{
    int m;
    while(lhs < rhs)
    {
        m = lhs + (rhs - lhs) / 2;
        if(arr[m] == value)
            return m;
        else if(arr[m] > value)
            rhs = m;
        else
            lhs = m + 1;
    }
    return -1;
}
2、二分查找求下界
int lower_bound(int* arr, int lhs, int rhs, int value)
{
    int m;
    while(lhs < rhs)
    {
        m = lhs + (rhs - lhs) / 2;
        if(arr[m] >= value)
            rhs = m;
        else
            lhs = m + 1;
    }
    return lhs;
}
3、二分查找求上界
int upper_bound(int* arr, int lhs, int rhs, int value)
{
    int m;
    while(lhs < rhs)
    {
        m = lhs + (rhs - lhs) / 2;
        if(arr[m] <= value)
            lhs = m + 1;
        else
            rhs = m;
    }
    return lhs;
}
总结:设lower_bound与upbound的返回值分别为L和R,则value出现的子序列为[L, R)。这个结论当value不在时也成立:此时L = R,区间为空。
4、(1)二分查找求大于等于某个数的最小数
int greaterthan_or_equalto(int* arr, int lhs, int rhs, int value)
{
    int tmp = upper_bound(arr, lhs, rhs, value);
    if(arr[tmp - 1] == value)
        tmp--;
    return arr[tmp];
}
  (2)二分查找求大于某个数的最小数
int greaterthan(int* arr, int lhs, int rhs, int value)
{
    int tmp = upper_bound(arr, lhs, rhs, value);
    return arr[tmp];
}
5、(1)二分查找求小于等于某个数的最大数
int lessthan_or_equalto(int* arr, int lhs, int rhs, int value)
{
    int tmp = lower_bound(arr, lhs, rhs, value);
    if(arr[tmp] > value)
        tmp--;
    return arr[tmp];
}
  (2)二分查找求小于某个数的最大数
int lessthan(int* arr, int lhs, int rhs, int value)
{
    int tmp = lower_bound(arr, lhs, rhs, value);
    tmp--;
    return arr[tmp];
}