查找算法—二分查找

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

 

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

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

 

时间复杂度: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 <iostream>

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<<binsearch(0,9)<<endl;

    return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值