先来看看经典的二分查找问题
不多说,代码附上
int BinarySearch(int *a,int TotalNumber,int number)
//求数number所在的位置
//TotalNumber:要比较的数量 number:查找的数字
{
int left=0,right=TotalNumber,mid;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]==number)
{
return mid;
}
else if(a[mid]>number)
//如果是递减的序列,a[mid]<number
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return -1;//如果没找到就返回-1
}
int lower_bound(int *b,int TotalNumber,int number)
//求序列中第一个number的位置(假定序列中有重复)
//TotalNumber:要比较的数量 number:查找的数字
{
int left=0,right=TotalNumber,mid;
while(left<right)
{
mid=(left+right)/2;
if(b[mid]>=number)
{
right=mid;
}
else
{
left=mid+1;
}
}
return left;
}
扩展2:序列中第一个大于number的数的位置
int upper_bound(int *c,int TotalNumber,int number)
//求序列中第一个大于number的数的位置
//TotalNumber:要比较的数量 number:查找的数字
{
int left=0,right=TotalNumber,mid;
while(left<right)
{
mid=(left+right)/2;
if(c[mid]>number)
{
right=mid;
}
else
{
left=mid+1;
}
}
return left;
}
呵呵,看起来二分查找是不是挺好玩的呢?来看看具体的小应用吧,利用二分法逼近根号2
const double eps=1e-10;//假设精度要求是1e-10
double f(double x)
{
return x*x;
}
double binarysearch()
{
double left=1,right=2,mid;
while(right-left>eps)
{
mid=(left+right)/2;
if(f(mid)>2)
{
right=mid;
}
else
{
left=mid;
}
}
return mid;
}