二分查找找一个数所在的范围

#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); 直到碰到第一个字符串结束符''为止,然后返回计数器值(长度不包含"")。

        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;

}

原文地址:https://www.cnblogs.com/unflynaomi/p/4596256.html