二分查找
先上二分查找的模板
注意:二分查找的必须是有顺序的数组,这样才有意义。
int BinarySearch(int a[],int size,int p)//假定数组a从小到大
{
int l=0;
int r=size-1;
int mid=(r-l)/2+l;//防止数过大
while(l<=r)
{
if(a[mid]==p)
{
return mid;
}else if(a[mid]<p){
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 min=0;
int mid=(r-l)/2+l;//防止数过大
while(l<=r)
{
if(a[mid]>=p)//“==”要注意不能给大于于号
{
l=mid-1;
}else {
min=mid;//我们要找的是小于p的最大的下标,这样的话当遇到比p小的时候就往后移动下标,这样就会遇到最大的那个下标只要及时更新min就好
r=mid+1;
}
}
return min;