二分查找(折半查找)

二分查找

二分查找也叫折半查找。要求这个序列是有序序列。

二分查找的时间复杂度为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)/2if(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)的时间。

 

所以我们要采用二分查找时我们就要考虑这个序列是否是经常改动,

如果这个序列的不能保持有序性,那么二分查找就不再适用。

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