码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找及其落点问题

时间:2014-12-06 20:16:48      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   sp   div   art   问题   log   

对于传统的二分查找,若能找到,则返回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;
}

感觉碉堡了呀!!

二分查找及其落点问题

标签:style   blog   ar   color   sp   div   art   问题   log   

原文地址:http://www.cnblogs.com/55open/p/4148640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!