二分查找模板

来源:互联网 发布:c语言 socket服务端 编辑:程序博客网 时间:2024/05/28 09:32
int lower(int l,int r,int key){    while(l<r)    {        int mid=l+(r-l)/2;        if(a[mid]==key) r=mid;        if(a[mid]<key) l=mid+1;        if(a[mid]>key) r=mid;    }    return l;}int upper(int l,int r,int key){    while(l<r)    {        int mid=l+(r-l+1)/2;        if(a[mid]==key) l=mid;        if(a[mid]<key) l=mid;        if(a[mid]>key) r=mid-1;    }    return l;}int binary(int l,int r,int key){    while(l<r)    {        int mid=l+(r-l)/2;        if(a[mid]==key) r=mid;        if(a[mid]<key) l=mid+1;        if(a[mid]>key) r=mid;    }    if(a[l]==key) return l;    else return -1;}

binary在找不到相同元素时返回-1,upper和lower会返回满足条件的第一个位置

double fsearch(double l,double r,double key){    while(r-l>e)    {        double mid=l+(r-l)/2;        if(key<mid) r=mid;        else l=mid;    }return l;}

浮点二分时,不用考虑边界问题

double threesearch(double l,double r){    double m1,m2;    while(r-l>e)//e是自定义精度    {        m1=l+(r-l)/3;        m2=r-(r-l)/3;        if(val(m1)<val(m2)) l=m1;//val是自定义函数        else r=m2;    }}
三分

0 0
原创粉丝点击