二分查找算法

http://blog.csdn.net/qq675927952/article/details/6319166


#include <iostream>  
using namespace std;  
//假设arr都是升序  
//int arr[9]={1,1,1,1,1,1,1,1,1};  
int arr[9] ={0,0,1,1,1,3,4,4,5};  
  
/*给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在返回-1*/  
int BiSearch1(int s ,int e,int v )  
{    
    if(s > e) return -1;  
    while( s < e-1 )  
    {  
      int mid = s + (e-s)/2; //防止溢出  
      if(v <= arr[mid] )  
       e = mid; //要最小的i,则整个区间要往左移  
      else  
       s = mid;   
    }  
  
   if(arr[s]==v) //要最小的i,则先判断最小的下标是否满足  
       return s;  
   else if(arr[e]==v)  
       return e;  
   else  
       return -1;  
}  
  
/*给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在返回-1*/  
int BiSearch2(int s,int e,int v)  
{  
  if(s > e) return -1;  
  while(s < e-1)  
  {  
    int mid =  s + (e-s)/2;  
     if(v >= arr[mid])  
         s = mid ; //求最大的i使得arr[i]等于v,则整个区间往右移  
     else  
         e = mid;  
  }  
  
   if(arr[e]==v)//先判断最大的下标是否满足  
      return e;  
   else if(arr[s]==v)   
      return s;  
   else  
      return -1;  
}  
  
/*给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在返回-1*/  
int BiSearch3(int s,int e,int v)  
{  
  if(s > e) return -1;  
  while(s < e-1)  
  {  
    int mid =  s + (e-s)/2;  
       
    if(v <= arr[mid]) // arr[i]小于v ,则整个区间往左移  
        e = mid;  
    else  
        s = mid;  
      
  }  
  
   if(arr[e] < v)//先判断最大的下标是否满足  
      return e;  
   else if(arr[s] < v)   
      return s;  
   else  
      return -1;  
}  
/*给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在返回-1*/  
int BiSearch4(int s,int e,int v)  
{  
  if(s > e) return -1;  
  while(s < e-1)  
  {  
    int mid =  s + (e-s)/2;  
       
    if(v >= arr[mid]) // arr[i]大于v ,则整个区间往右移,  
        s = mid;  
    else  
        e = mid;  
      
  }  
  
   if(arr[s] > v)//先判断最大的下标是否满足  
      return s;  
   else if(arr[e] > v)   
      return e;  
   else  
      return -1;  
}  
int main()  
{  
    cout<<BiSearch1(0,8,1)<<endl;  
    cout<<BiSearch2(0,8,1)<<endl;  
    cout<<BiSearch3(0,8,1)<<endl;  
    cout<<BiSearch4(0,8,1)<<endl;  
    
   system("pause");  
  return 0;  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值