二分查找

Posted gland

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找相关的知识,希望对你有一定的参考价值。

二分查找

概念:

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求

    线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

算法复杂度:

    二分查找法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况

    下用O(log n)完成搜索任务。

基本思想:

    首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成

    功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步

    查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子

    表不存在为止,此时查找不成功。

实现:

    二分查找的实现方法太多,这是由不同的需求所决定的。下面列出最为简单的两种,其余几种皆可类推。

     1:被查找有序序列中只有一个值与目标元素相等。

int bisearch(int array[], int low, int high, int target)
{
    while (low <= high)
    {
        int mid = low + (high - low) / 2;
        if (array[mid] < target)
            low = mid + 1;
        else if (array[mid] > target)
            high = mid - 1;
        else
            return mid;
    }
    return low;
}                   

 

        2:被查找有序序列中有多个值与目标元素相等。

 

int bisearch(int array[], int low, int high, int target)
{
    while (low <= high)
    {
        int mid = low + (high - low) / 2;
        if (array[mid] < target)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return low;
}               

注意:

    关于中位数,mid = low + (high - low) / 2 = (2 * low + high - low) / 2 = (low + high) / 2。就算式来说,

    两式相等,但是由于后者有溢出风险,前者最为保险。循环的结束条件为 low > high,这个不用多说。

    满足结束条件后,返回low,其实二分查找的整个过程都在维护low,只有中位数小于目标元素时low

    才前进,不会后退,逐渐逼近目标数,low就是目标数该插入的位置。

以上是关于二分查找的主要内容,如果未能解决你的问题,请参考以下文章

java 二分查找法

代码题(12)— 二分查找

二分查找代码

PHP实现二分查找算法(代码详解)

「算法笔记」一文摸秃二分查找

C语言二分查找