查找算法,二分查找,二分特殊查找算法

查找的目的是什么?
查找到关键字绑定的信息,这里也就是与关键字映射的那个信息
一.二分查找算法



int binary_search(int *num,int n,int x)
{
    int head =0,tail = n-1, mid;
    while(head <= tail)  //这边可以相等就是为了查找数组的边界是否为解
    {
    mid =(head+tail) >> 1;
    if(num[mid] == x) return mid;
    else if(num[mid] < x) head = mid+1;
    else tail = mid- 1;
    }
    return -1;
}

特殊情况的二分查找
//11111110000000


int binary_search1(int *num,int x,int n)
{
    int head = -1,tail = n-1,mid;//增加了一个下标为-1的虚拟头,防止都为0时,返回的值有歧义
    while(head <= tail)
    {
        mid = (head+tail+1) >>1;
        if(num[mid] == x) head = mid;//等于要查找的值时把左边的全都舍弃,因为这个时候mid位置也有可能是最后一个x所以,不能像原来的二分法舍掉,
                                     //但是这样因为每次循环没有往后走一位,就会导致head一直不变,陷入死循环,比如当head为3,tail为4时,
                                     //head就会一直为3陷入一个死循环,为了避免这种情况,就需要mid向上去整也就是mid=(head+tail+1)>>1
        else tail = mid -1;//这边还是会自动往前再走一位,所以右边不会陷入死循环问题,但是当数组所有位都是0时,又会产生新的问题,
                           //那就是当循环到head等于tail时,返回的为0,这是就会有个歧义,是返回的位置为0位还是,没有找到返回0,
                           //所以这时得在数组前加一个虚拟头head=-1,tail =n,这样查找到最左边没有找到时返回的就是-1。
    }
    return head;//当head等于tail时,head的位置就是最后一个1
}

特殊情况二分查找
000000001111111,找到第一个1的位置

int binary_search2(int*num,int x,int n)
{    
     int head =0,tail = n,mid;    
     while(head <= tail)   
     {       
        mid =(head+ tail) >> 1;//这里是向下去整,以3的位置为0,4的位置为1举例,如果向上取整tail一直为原来的位置造成死循环    
        if(num[mid] == x) tail = mid;//这里要舍掉右边,但是不能舍掉mid本身,这样mid就不能向上去整,要向下取整      
         else head = mid+1;   
          }    
          return head = n ?-1:head;
 }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值