二分查找

来源:互联网 发布:天津软件培训 编辑:程序博客网 时间:2024/06/06 05:47
二分查找也叫折半查找,二分查找的查找效率是十分高效的,但是有一点:二分查找的目标序列必须是提前排好序的。若是一个无序序列,则先进行排序再查找。
#include<iostream>template<typename T>int binarySearch(T *tmp,int left,int right,T target){int i = left,j=right;int mid;while(i<=j){mid = (i+j)/2;if(target == tmp[mid])return mid+1;else if(target<tmp[mid])j = mid-1;else i = mid+1;}return -1;}int main(){int A[]={1,3,5,8,10,13,24,36,37};int t = 10;//待搜索元素int size = sizeof(A)/sizeof(*A),pos;if(pos=binarySearch(A,0,size-1,t))std::cout<<"locate at:"<<pos<<std::endl;elsestd::cout<<"not found."<<std::endl;}
下面进行时间复杂度分析:
对于二分查找,最坏的情况下也就是序列中不存在所要搜索的元素。
此时的时间复杂度:

需要说明的是取下整是因为对于序列长度n是偶数的时候没有影响,对应奇数n,二分查找的时候已经比较了中间元素,利用中间元素分成两半之后,前半部分和后半部分都不能包含中间元素。所以对应的查找子序列长度取下整。我们将比较是为关键语句,那么式子后面的加1,就是每次折半后之进行一次比较。
从上面的式子很明显可以看出二分查找的时间复杂度为logn。
对于一个混乱的序列来讲,其前期工作还有排序。所以在计算二分查找时间的时候一般会加上排序的时间,而排序的时间是nlogn的数量级的。所以对于混乱序列的查找时间也是nlogn数量级的。
针对数据序列较大的情况下,还有一些提高排序时间的方法,然而那些方法的比较复杂,在没有特殊用途的情况下,一般的排序方法够用就行。

0 0