二分查找算法(折半查找算法)

二分查找又称折半查找。
优点:比较次数少,查找速度快,平均性能好;
缺点:要求待查表为有序表,且插入删除困难。

折半查找方法适用于不经常变动而查找频繁的有序列表。
1、首先,假设表中元素是按升序排列
2、将表中间位置记录的关键字与查找关键字比较
3、如果两者相等,则查找成功;
4、否则利用中间位置记录将表分成前、后两个子表,
5、如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
6、重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

时间复杂度就是while循环的次数 O(logn)

#include <iostream>
using namespace std;

//low和high是指的是对应的数组的下标 。
int BinSearch(int array[],int low,int high,int target)
{
    while(low <= high)
    {
        /*使用(low+high)/2会有整数溢出的问题。
          问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
          这样,产生溢出后再/2是不会产生正确结果的。
          而low+((high-low)/2)不存在这个问题*/
        int mid  =low +(high - low)/2;

        if(array[mid] > target)
        {
            high = mid - 1; 
        }
        else if(array[mid] < target)
        {
            low = mid + 1;  
        }
        else
        {
            return mid; 
        }
    }
    return -1;
}

int main()
{
    int a[]={1,2,3,4,5};
    int result = BinSearch(a,0,4,1);
    cout << result << endl;
}

递归算法:

#include <iostream>
using namespace std;

int k;

int found(int a[],int x,int y)
{

    int mid = x + (y - x)/2;
    //递归结束的条件
    if(x > y)
    {
        return -1;
    }
    else
    {
        if(a[mid] == k)
        {
            return mid;
        }
        else if(a[mid] > k)
        {
            return found(a, x , mid - 1);
        }
        else
        {
            return found(a, mid + 1,y); 
        }
    }
}
int main()
{
    int a[]={1,2,3,5,7,8,9,10,34,45};
    while(cin >> k)
    {
        cout << found(a,0,9) << endl;
    }
    return 0;
}

递归的另一种方式:

int found(int a[],int start,int end)
{

    int mid = start+ (end- start)/2;
    //递归结束的条件
    if(start> end)
    {
        return -1;
    }
    else
    {
        if(a[mid] == k)
        {
            return mid;
        }
        else if(a[mid] > k)
        {
            end = mid - 1;
        }
        else
        {
            start = mid + 1;
        }
        return found(a,start,end);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值