个人总结的几个变种(只是为了描述算法本身,为了简单不考虑越界等等异常情况),欢迎补充。
/*
二分查找的前提是数组有序
二分查找的时间复杂度:O(lgn)
以下列出二分查找的三种动机:
1、查找满足条件的关键字的位置
2、查找满足条件的最小位置
3、查找满足条件的最大位置
找不到返回-1,找到了则返回位置
*/
//动机1(原始模型):查找满足条件的关键字的位置
int BinarySearch(int *a,int l,int r)
{
int m;
while(l<=r)
{
m=(l+r)/2;
if(a[m]==key)
return m;
if(a[m]>key)
r=m-1;
else
l=m+1;
}
return-1;
}
//动机2:找满足条件的最小位置
int BinarySearch(int *a,int l,int r)
{
int m,ans=-1;
while(l<=r)
{
m=(l+r)/2;
//满足条件
if(ok())
ans=m,r=m-1;
else
l=m+1;
}
return ans;
}
//动机3:找满足条件的最大位置
int BinarySearch(int *a,int l,int r)
{
int m,ans=-1;
while(l<=r)
{
m=(l+r)/2;
//满足条件
if(ok())
ans=m,l=m+1;
else
r=m-1;
}
return ans;
}
//动机2、3十分相似,举一种常用情况:找小于等于某数的最大位置
int BinarySearch(int *a,int l,int r,int key)
{
int m,ans=-1;
while(l<=r)
{
m=(l+r)/2;
if(key>=a[m])
ans=m,l=m+1;
else
r=m-1;
}
return ans;
}
//变型1:找满足条件的最小数(double)
double BinarySearch(double l,double r)
{
double m,ans;
//保留n位小数就让精度为n+1位,比如要求保留3位小数就让精度为4位
while(r-l>=0.0001)
{
m=(l+r)*0.5;
if(ok())
ans=m,r=m;
else
l=m;
}
return ans;
}