码迷,mamicode.com
首页 > 编程语言 > 详细

重拾算法之路——二分搜索

时间:2014-11-03 22:34:55      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:重拾算法之路   二分搜索   算法   

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************



隶属于——递归与分治


描述: 给定 已排好序 的n个元素a[0;n-1],现在要在这n个元素中找出一特定元素x。


朴素法: 当然这是好听的说法,明白点叫最笨的方法,就是顺序搜索,逐个比较0到n-1中元素,直至找出元素x或搜索遍所有元素,确定x不在元素中,这个方法也很好的利用n个元素排好序的条件,因此最坏的情况,时间复杂度为O(n)次比较。


二分搜索: 这种方法充分利用元素间的次序关系,采用分治策略,可在最坏情况下用O(log(n))时间完成搜索任务。基本思想就是将 n个元素 分成个数一样的两半,取a[n/2]与x作比较,

如果x=a[n/2],则找到x,算法终止。

如果x<a[n/2],则只在数组a的左半部分(0到n/2)中继续搜索

如果x>a[n/2],则只在数组a的右半部分(n/2到n-1)中继续搜索


代码程序

template< class Type >

int BinarySearch( Type a[], const T& x, int n)
{
    int l=0,r=n-1;
    while( l <= r )
    {
        int m = (l+r)/2;
        if( x == a[m] )    return m;
        if( x < a[m] )    r = m-1;
        else    l = m+1;
    }
    return -1;    // 找不到x,则返回-1
}


分析: 从上面代码可以看出,每执行一次算法的while循环,待搜索数组的大小减少一半。

因此,在最坏的情况下,while数组执行了O(log(n))次;而循环体内的代码执行时间约为O(1)。

最终,整个算法在最坏情况下的时间复杂度为 O(log(n))。


小知识: 二分搜索算法的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事情。Knuth在他的著作《The Art of Computer Programming:Sorting and Searching》中提到:第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法却直到1962年才出现。




***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

重拾算法之路——二分搜索

标签:重拾算法之路   二分搜索   算法   

原文地址:http://blog.csdn.net/lttree/article/details/40748517

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