#include<iostream>
using namespace std;
//选好二分法的策略 ,二分查找找到一个数所在的范围 比如 2,4,8,12,15,20,23,56,79,90 16的范围就是15 20
/**找到比key大的第一个数,比key大的最小数**/
int findRight(int data[],int low,int high,int key)
{
int up=high;
int mid;
while(low<high)
{
mid=(low+high)/2;
if(data[mid]<=key)
low=mid+1;//要搜索的答案必须比key大,所以下界肯定在mid的右边
else
high=mid; //key<data[mid]答案可能就是在mid,或者在mid的左边,尽量小的数,往左去
}
if((high==low)&&(high==up)&&(key>data[up]) )
// extern unsigned int strlen(char *s); 直到碰到第一个字符串结束符‘\0‘为止,然后返回计数器值(长度不包含"\0")。
return -1;
else
return low;
}
//找到比key小的最大数
int findLeft(int data[],int low,int high,int key)
{
int down=low;
if(key<data[down])//根据不同的源数据情况,两个出口皆有可能, 只能提前判断
return -1;
int mid;
while(low+1!=high&&low!=high)//有两个出口
{
mid=(low+high)/2;
if(data[mid]>=key)
high=mid-1;//要搜索的答案必须比key小,所以下界肯定在mid的左边
else
low=mid; //key>data[mid]答案可能就是在mid,或者在mid的右边,尽量往右去,找大的数
}
if(low+1==high)//如果不加这个就会出现死循环
{
if(key>data[high])
return high;
else if(key>data[low])
return low;
}
else
if(low==high)
return low;
}
int main()
{
int data[]= {2,4,8,12,15,20,23,56,79,90};//测测边界值
// int key;
// cout<<"请输入数字;";
// cin>>key;
// cout<<endl;
// int larger=findRight(data,0,5,key);
// if(larger==-1)
// cout<<"您输入的数字太大!"<<endl;
// else
// cout<<"右界为: "<<data[larger]<<endl;
int key2;
cout<<"请输入数字;";
cin>>key2;
cout<<endl;
int smaller=findLeft(data,0,9,key2);
if(smaller==-1)
cout<<"您输入的数字太小!"<<endl;
else
cout<<"左界为: "<<data[smaller]<<endl;
return 0;
}