zoukankan      html  css  js  c++  java
  • 二分查找找一个数所在的范围

    #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;

    }

  • 相关阅读:
    npm使用淘宝镜像源
    MapReduce任务执行源码分析
    spark.sql.shuffle.partitions到底影响什么
    hdfs的写入数据流程及异常情况分析
    面试题
    HDFS的双缓冲机制详解
    rpm包无法卸载
    hive建表支持的文件类型与压缩格式
    centos6中同时安装python3.7与python2.6
    linux centos6.x安装mysql5.6.33版本
  • 原文地址:https://www.cnblogs.com/unflynaomi/p/4596256.html
Copyright © 2011-2022 走看看