一:二分查找函数,写一个函数BinarySeach,在包含size个元素,从小到大排序的int数组a里查找元素P,如果找到,则返回元素下标,如果找不到,则返回-1.复杂度为O(log(n))
int BinarySearch(int a[],int size,int p)
{
int L=0;//查找区间的左端点
int R=size-1;//查找区间的右端点
while(L<=R)//如果查找区间不为0就继续查找
{
int mid=L+(R-L)/2;//取查找区间正中元素的下标
if(p==a[mid])
return mid;else if(p>a[mid])
L=mid+1;//设置新的查找区间的左端点
else
R=mid-1;//设置新的查找区间的右端点
}
return -1;
}
二:写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素。找到则返回其下标,找不到则返回-1
int LowerBound(int a[],int size,int p)
{
int L=0;//查找区间的左端点
int R=size-1;//查找区间的右端点
int lastpos=-1//到目前为止找到的最优解
while(L<=R)//如果查找区间不为0就继续查找
{
int mid=L+(R-L)/2;//取查找区间正中元素的下标
if(a[mid]>=p)
R=mid-1;
else {
lastpos=mid;
L=mid+1;
}
}
return lastpos;
}
三:注意
二分查找的区间必须是排好序的,递增或递减的。
为了防止(L+R)过大溢出,通常将 int mid=(L+R)/2;成 int mid=L+(R-L)/2;
四:可用于求方程的根