• 二分查找总结


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

  • 相关阅读:
    按格式读取csv文件内容
    C#分块拷贝大文件
    在 Active Directory 上也有 LINQ 可以用了:LINQ to Active Directory
    CSVDE
    lucene索引查看工具luke和文本提取工具Tika
    Perf工具
    RHEL7.2安装
    Hive on ES
    灰度发布
    LSM树由来、设计思想以及应用到HBase的索引
  • 原文地址:https://www.cnblogs.com/L-King/p/5322594.html
Copyright © 2020-2023  润新知