二分查找

二分查找

一、二分查找的使用条件
       二分查找又称折半查找,在有序的数据集中,依次与中间元素比较,需要获取中间元素的下标,故需要以下二个条件:
     1、顺序存储数据结构
     2、有序
二、二分查找实现
       //二分查找(前提:arr已从小到大排序
       template<typename T>
       int binarySearch(T arr[],int length,T key)
       {
          int beginIndex = 0;
          int endIndex = length - 1;
          while(beginIndex <= endIndex)
          {
                  //取中间元素的下标 
                  int midIndex = (beginIndex + endIndex) >> 1;

                  if(arr[midIndex] == key)// 中间元素等于key,查找成功 
                  {
                           return midIndex;
                  }
                  else if(arr[midIndex] > key)//中间元素大于key,只需从前半部分查找key 
                  {
                           endIndex = midIndex - 1;
                  }
                  else//中间元素小于key,只需从后半部分查找key 
                  {
                           beginIndex = midIndex + 1; 
                  }//end of else 
           }//end of while

          return -1;//未找到key,返回-1 
        }//end of func
三、二分查找递归实现(效率较低,不推荐)
       //二分递归查找(前提:arr已从小到大排序
       template<typename T>
       int binarySearch(T arr[],int beginIndex,int endIndex,T key)
       {
            if(beginIndex > endIndex)
            {
                    return -1;
            }
            else
            {
                    int midIndex = (beginIndex + endIndex) >> 1;

                    if(arr[midIndex] == key)//中间元素等于key,返回下标 
                    {
                            return midIndex;
                    }
                    else if(arr[midIndex] > key)//中间元素大于key,递归在前半部分递归查找 
                    {
                            return binarySearch(arr,beginIndex,midIndex - 1,key);
                    }
                    else//中间元素小于key,递归在后半部分递归查找 
                    {
                             return binarySearch(arr,midIndex+1,endIndex,key);
                    }//end of inner else
            }//end of outer else
      }//end of func



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值