您的位置:首页 > 其它

二分查找

2013-02-25 15:43 155 查看
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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: