呼如林
个人总结的几个变种(只是为了描述算法本身,为了简单不考虑越界等等异常情况),欢迎补充。/*
二分查找的前提是数组有序
二分查找的时间复杂度: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;
}