查找算法—二分查找

假设表中元素是有序的,将表的中间位置的关键字与所需的关键字比较,相等则成功,否则分为前后两个子表,若所需的值大于中间元素,则在后半部分查找,否则在前半部分查找。重复上述过程,直到查询到结果。

 

优点:比较次数少,速度快

缺点:要求待查表为有序表。

 

时间复杂度:O(h)=O(log2n)

 

c/c++代码实现:

方法一:循环

 

int binsearch(SeqList *R,int n,KeyType K)

{

    int low=0;

    int higt=n-1;

    int mid;



    while(low<=high){



    if(K==R[low].key)

        return low;

    if(K==R[high].key)

        return high;

    mid=low+(high-low)/2;

    /*使用(low+high)/2会有整数溢出的问题

    (问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,

    这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)

    不存在这个问题*/



        if(K==R[mid].key)

        return mid;



        if(K>R[mid].key){

            low=mid+1;

        }

        else

            high=mid-1;

    }



    if(low>high)

        return -1;

}

这份代码注意到了很多问题,比如mid的溢出问题,就非常仔细。

还有对头尾进行一个判断,而不是只判断中间。这样能够提高效率。

 

方法二:递归

#include 

using namespace std;



int a[10]={1,2,3,4,5,6,7,8,9,10};

int k;

int binsearch(int low, int high){

    int mid=low+(high-low)/2;



    if(low>high)

        return -1;



    if(a[low]==k)

        return low;

    else if(a[high]==k)

        return high;



    else if(a[mid]==k)

        return mid;

    else{

        if(k>=a[mid])

            binsearch(mid+1, high);

        else

            binsearch(low, mid-1);

    }

}



int main(){

    cin>>k;

    cout<

 

你可能感兴趣的:(c++后台面试知识点)