码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找

时间:2018-08-03 23:13:55      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:就是   查找   要求   记录   sea   存储结构   维护   利用   ref   

二分查找

概念:

    二分查找也称折半查找(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就是目标数该插入的位置。

二分查找

标签:就是   查找   要求   记录   sea   存储结构   维护   利用   ref   

原文地址:https://www.cnblogs.com/Gland/p/Gland.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!