二分查找总结

二分查找是应用于不经常修改的并且频繁查找的有序数组中的一种查找算法,时间复杂度O(nlogn);

常用的几种模式为:

  1,查找某个关键字是否在数组中出现

  2,查找第一个比关键字大的值的位置

  3,查找最后一个比关键字小的值的位置

以下是我个人写的这三种常用的模板:

#include<stdio.h>
int bs1(int a[],int l,int r,int key)//查找是否有key,若有则返回key的位置,没有则返回-1 
{
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(a[mid]>key)
            r=mid-1;
        else if(a[mid]<key)
            l=mid+1;
        else
            return mid;
    }
    return -1;
}
int bs2(int a[],int l,int r,int key)//找到第一个比key大的,若要大于等于,修改成if(a[mid]>=key) 
{
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(a[mid]>key)
            r=mid;
        else
            l=mid+1;
    }
    if(a[l]<=key)    return r+1; 
    return l;
}
int bs3(int a[],int l,int r,int key)//查找最后一个比key小的,若要小于等于,修改成if(a[mid]<=key) 
{
    while(l<r)
    {
        int mid=((l+r)&1)+(l+r)>>1;
        if(a[mid]<key)
            l=mid;
        else
            r=mid-1;
    }
    if(a[l]>=key)    return l-1;
    return l;
}
int main()
{
#define bs bs3
    int a[10]={1,2,4,5,8,9,11};
    printf("%d
",bs(a,0,6,0));
    return 0;
} 
BinSearch

以上总结纯属个人意见,这次的代码应该相当容易看懂,所以代码内就没有详细地注释,读者根据样例手动模拟一遍就能明白了。

若看不懂可以评论问我,不在的话加QQ:781675302

原文地址:https://www.cnblogs.com/L-King/p/5322594.html