二分查找
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];
}
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];
}
相关文章推荐
- 二分查找之详细篇
- 二分查找
- 编程基础之二分查找 06:月度开销 (二分,使区间和最小)
- 二分查找
- 变形的二分查找
- 二分查找与快排算法
- 漫谈二分查找
- 你真的会二分查找吗?
- 静态查找方法(顺序查找与二分查找)
- 【2015ZUFE新生赛网络同步赛M】【DP 打表 二分】GW I (3) 暴力预处理+分类打表二分查找
- 二分查找的两种(找到val,找到第一val)
- C语言:顺序查找和二分查找
- HDUOJ 1950 - Bridging signals(DP + 二分查找:最长递增子序列LIS【nlogn算法】)
- 写了二分查找算法,欢迎查找算法bug
- Can you find it? hdu2141 二分查找
- 二分查找(vijos1450包裹快递)
- 二分查找
- 对分查找(二分查找)
- [bzoj3343]&&[洛谷2810] [分块][块内排序][二分查找]教主的魔法
- 漫谈二分查找-Binary Search (转)