二分查找
来源:互联网 发布: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];
}