二分查找及其落点问题

对于传统的二分查找,若能找到,则返回target的下标,若找不到则返回-1后,退出函数。齐代码比较简单,如下:

int bSearch(vec<int> vec, int start,int end,int target)
{
    int first = start,last = end,mid;
    while(first<=last)
       {
           mid = (first + last)>>1;
           if(vec[mid] == target) return mid;
           else if(vec[mid] < target) first = mid + 1;
           else last = mid - 1;
       }     
      return -1;   
}

上面的代码在处理一般的查找可满足要求,但是对于一些特殊情形有局限性,如重复的,查找失败后还要插入的....

下面介绍2类二分查找的变形:前提:查找的数target,vec[0]<=target<=vec[end],如果不在下面的性质不成立。且函数的start参数和end参数是数组元素的下标,对于输入vector<int> vec = {1,2,2,4,4,8,10},start = 0,end = 6;若end = 7,对Yes_Left和No_Right无影响,但是对后面两种情况有影响,特别要注意

输入:vector<int> vec = {1,2,2,4,4,8,10};

查找成功返回最左边的值得下标(Yes_Left),即查找4返回3,或者查找失败,返回数组中恰好大于target的元素的下标(No_Right),即查找3返回3,这2种情况代码如下:

int bSearch(vector<int> vec,int start,int end,int target)
{
  int mid,left = start,right = end;
  while(left<=right)
    {
        mid = (left + right)>>1;
        if(vec[mid]>=target) right = mid - 1;
        else left = mid + 1;
    }
    return left;
}

还是上面的输入,查找成功返回最右边的值的下标(Yes_Right),即查找4返回4,或者查找失败,返回数组中恰好小于target的元素的下标(No_Left),即查找3返回2,代码如下

int bSearch(vector<int> vec,int start,int end,int target)
{
     int mid,left = start,right=end;
     while(left<=right)
     {
         mid = (left + right)>>1;
         if(vec[mid]>target)right = mid - 1;
         else left = mid + 1;
     }
      return right;
}

感觉碉堡了呀!!

转载于:https://www.cnblogs.com/55open/p/4148640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值