zoukankan      html  css  js  c++  java
  • 二分查找总结

    二分查找是应用于不经常修改的并且频繁查找的有序数组中的一种查找算法,时间复杂度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

  • 相关阅读:
    认识Linux
    Java之安装环境
    Markdown学习
    使用cacti监控linux server的接口流量
    IDRAC安装dell服务器操作系统(linux or windows),用到生命周期管理器
    网络编程--练习题
    linux搭建ntp服务器-添加交换机客户端,windows客户端
    linux centos7搭建redis-5.0.5
    linux centos7搭建mysql-5.7.29
    对称加密与非对称加密
  • 原文地址:https://www.cnblogs.com/L-King/p/5322594.html
Copyright © 2011-2022 走看看