***************************************转载请注明出处: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