• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
L&King
有何不可!
   首页    新随笔    联系   管理    订阅  订阅

二分查找总结

二分查找是应用于不经常修改的并且频繁查找的有序数组中的一种查找算法,时间复杂度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\n",bs(a,0,6,0));
    return 0;
} 
BinSearch

 

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

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

posted @ 2016-03-26 12:04  L&King  阅读(202)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3