1、整数二分
eg:q[]: 1 1 2 3 4 5 5 5 6 7 8 9
n=11; x=5;
int binary_search1(int q[],int n,int x) //找出x第一次出现的下标
{
int l=-1,r=n; //左右边界
while(l+1<r){ //重合时(l+1==r)就分好了边界
int mid=l+r>>1;
if(q[mid]<x) l=mid; //当mid满足某种性质时,mid前所有数都满足(因为线性),
else r=mid; //则某一边边界可拓展到mid。这就是二分的过程
}
if(r==x) return r;//5 //确定输出
else return -1;
}
int binary_search2(int q[],int n,int x) //找出x最后一次出现的下标
{
int l=-1,r=n;
while(l+1<r){
int mid=l+r>>1;
if(q[mid]<=x) l=mid;
else r=mid;
}
if(l==x) return l;//7
else return -1;
}
2、浮点数二分
eg.求x的三次方根(保留六位小数)
//x>0
double binary_search3(double x)
{
double l=-x,r=x;
while(r-l>1e-8){//要多保留2位 // 改为:for(int i=0;i<100;i++),二分100次,精度更高
double mid=(l+r)/2;
if(mid*mid*mid<=x) l=mid;
else r=mid;
}
return l;// return l or r both ok
}