http://blog.youkuaiyun.com/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;