二分查找(折半查找)
二分查找
二分查找也叫折半查找。要求这个序列是有序序列。
二分查找的时间复杂度为O(logn),比顺序查找要快一些,比具体步骤如下:
1:找到序列的中点,比较目标数与序列中点对应的数的大小。
2:目标数大于序列中点对应的数,序列的起点变为原序列的中点加1一;
目标数小于序列中点对应的数,序列的终点变为原序列的中点减一。
目标数等于序列中点对应的数,返回该数在序列中对应的下标。
3:重复步骤1,2直到找到目标数或者该序列中没有该数时结束。
int BinSearch(int R,int K)//R为有序表,k为要查找的目标数 { //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零 int low=1; int high=n; int mid; //置当前查找区间上、下界的初值 while(low<=high) //当前查找区间R[low..high]非空 { mid=(low+high)/2; if(R[mid]==K) return mid; //查找成功返回 if(R[mid]>K) high=mid-1; //继续在R[low..mid-1]中查找 else low=mid+1; //继续在R[mid+1..high]中查找 } return 0; //当low>high时表示查找区间为空,查找失败 }
如果该序列无序,可用sort函数进行快排。二分查找比顺序查找要快,但是也是有缺点的,
就是二分查找需要将序列排序,序列如果是无序的那么就需要将序列排序,而排序本身就
是比较费时,即使用高效率的排序算法也要花费O(nlogn)的时间。
所以我们要采用二分查找时我们就要考虑这个序列是否是经常改动,
如果这个序列的不能保持有序性,那么二分查找就不再适用。