二分查找法

优缺点

二分查找又称折半查找。

  1. 优点:比较次数少,查找速度快,平均性能好。
  2. 缺点:要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表

举个例子

首先,假设表中元素是按升序排列,

  1. 将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
  2. 否则利用中间位置记录将表分成前、后两个子表,
    如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,
    否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录使查找成功,或直到子表不存在为止,此时查找不成功

算法复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,
取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;
如果x<a[n/2],则只要在数组a的左半部分继续搜索x,
如果x>a[n/2],则只要在数组a的右半部搜索x.

时间复杂度无非就是while循环的次数!

总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O()=O(logn)

伪代码

下面提供一段二分查找实现的[伪代码]

int BinSearch(SeqList *R,int n,KeyType K)
{
    //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
    int low=0,high=n-1,mid;//置当前查找区间上、下界的初值
    while(low<=high)
        {
            if(R[low].key==K)
                return low;
            if(R[high].key==k)
                return high;    //当前查找区间R[low..high]非空
            mid=low+((high-low)/2);
            /*使用(low+high)/2会有整数溢出的问题
            (问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
                这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)
                不存在这个问题*/
            if(R[mid].key==K)
                return mid;//查找成功返回
            if(R[mid].key<K)
                low=mid+1;//继续在R[mid+1..high]中查找
             else
                 high=mid-1;//继续在R[low..mid-1]中查找
        }
    if(low>high)
        return -1;//当low>high时表示所查找区间内没有结果,查找失败
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地...
    Dorm_Script阅读 2,533评论 6 51
  • 二分查找法主要用来解决查找的问题 1、二分查找法Binary Search (注)对于有序数列才能使用二分查找法。...
    老实李阅读 778评论 1 1
  • Hello,大家好,今天给大家继续讲解排序系列。可能有细心的"鸟友"会问,你不是讲解排序吗?怎么今天的主题是...
    Leon_Geo阅读 299评论 0 1
  • 天气大好,风也褪去了昨日的刺骨寒气,仿佛把所有的阳光都吹到我身上来。 和一个熟悉的朋友走回宿舍。按照以往的印象,我...
    零下E度阅读 403评论 0 1
  • 秋千荡起时光的荏苒 我还记得那年叶落满地 拖着大大的扫帚说我要清理 最后总是在叶上打滚 满身污泥 只为近近的听叶破...
    哒哒的小马达阅读 165评论 2 3