不同情况下的二分搜索模板

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/8538760.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~

 

二分搜索算是常见的搜索方式了,由于有时候经常会遇到返回值不同的情况出现,所以就把能想到的几个整理了下。

1.如果存在,返回对应的索引(任意一个即可);如果不存在,返回-1

/*
a为已经排序好的数组,t为要查找的目标值,n为数组长度
如果存在,返回任意一个索引即可
如果不存在,返回-1
*/
int binarySearch(int *a,int t,int n){
    int l=0,r=n-1;
    int mid;
    //注意这里是l<=r
    while(l<=r){
        mid=(l+r)>>1;
        if(a[mid]==t)
            return mid;
        if(t<a[mid])
            r=mid-1;
        else
            l=mid+1;
    }
    return -1;
}
View Code

 

2.如果存在多个目标值t,返回最小的索引;如果不存在,返回-1

/*
a为已经排序好的数组,t为要查找的目标值,n为数组长度
如果存在多个目标值t,返回最小的索引
如果不存在,返回-1
*/
int binarySearchMinIdx(int *a,int t,int n){
    int l=0,r=n-1;
    int mid;
    while(l<r){
        mid=(l+r)>>1;
        printf("%d %d %d\n",l,r,mid);
        //注意,由于是返回索引值最小的,所以这里r=mid,而不是mid-1,因为mid也有可能是最终的结果。
        if(t<=a[mid])
            r=mid;
        else
            l=mid+1;
    }
    //while条件结束时,l==r,因此判断a[l]是否=t即可
    if(a[l]==t)
        return l;
    else
        return -1;
}
View Code

 反之,也有返回最大的索引。拿做数学题经常用的话语来讲,同理即可,就是任性。

 

3.返回 值<=t的索引,若不存在,返回0(也可以自己改为-1,加个条件而已)

注意,第3个和第4个,是在a[1~n]中搜索,而不是在a[0~n-1]中搜索。

可以自己尝试去写在[0~n-1]中搜索的情况,其实差不多的,只不过最后返回的时候要多几个判断条件

/*
在数组a[1~n]中搜索t
若t在,则返回t的索引
若t不在a中,则返回的是比t小的索引
如果没有比t小的,则返回0
*/
int binarySearchSmallOrSmaller(int *a,int t,int n){
    int l=0,r=n+1;
    int mid;
    //注意这里为啥是l<r-1,因为下面l=mid,r=mid,所以当最后若对于l=r-1,t>=a[l],就会陷入死循环
    while(l<r-1){
        mid=(l+r)>>1;
        if(a[mid]<=t)
            l=mid;
        else
            r=mid;
    }
    return l;
}
View Code

 

4.返回 值>=t的索引,若不存在,返回n+1(也可以自己改为-1,加个条件判断一下即可)

/*
在数组a[1~n]中搜索t
若t在,则返回t的索引
若t不在a中,则返回的是比t大的索引
如果没有比t大的,则返回n+1
*/
int binarySearchLargeOrLarger(int *a,int t,int n){
    int l=0,r=n+1;
    int mid;
    while(l<r-1){
        mid=(l+r)>>1;
        if(a[mid]>=t)
            r=mid;
        else
            l=mid;
    }
    return r;
}
View Code

 

posted @ 2018-03-10 12:32  辰曦~文若  阅读(320)  评论(0编辑  收藏  举报