二分查找 - 代码
一、迭代实现
在有序序列中查找给定元素:
int bsearch(int *A, int x, int y, int v)
{
int m;
while(x < y)
{
m = x+(y-x)/2;
if(A[m] == v)
return m;
else if(A[m] < v)
x = m+1;
else y = m;
}
return -1; //没找到v或调用时x>=y
}
查找区间以及返回值可能位于的区间:[x, y)
原因:?
空区间:[x, x)
二、二分查找求下界
如果给定元素存在于有序序列中,返回元素第一次出现的位置下标;若元素未出现过,返回一个下标,使得在该下标处插入给定元素后,新的序列仍然有序:
int lower_bound(int *A, int x, int y, int v)
{
int m;
while(x<y)
{
m = x+(y-x)/2;
if(A[m]>=v) y=m; //如果A[m]大于等于v,所求下标一定位于[x, m]
else x=m+1;
}
return x;
}
返回值可能位于的区间:[x, y](右端为闭区间:例如:如果v>A[y-1],则应当返回y)
三、二分查找求上界
如果给定元素存在于有序序列中,返回元素最后一次出现的位置的后面一个下标;若元素未出现过,返回一个下标,使得在该下标处插入给定元素后,新的序列仍然有序:
int upper_bound(int *A, int x, int y, int v)
{
int m;
while(x<y)
{
m = x+(y-x)/2;
if(A[m]<=v) x=m+1;
else y=m;
}
return x;
}
返回值可能位于的区间:[x, y]