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


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

    }

  • 相关阅读:
    正则表达式积累
    Windows界面编程第七篇 文件拖拽(文件拖放)
    设置 Eclipse 智能代码提示,大幅度减少 alt+/ 使用频率,打每个字都出现代码提示的办法
    CodeFx:一站式微软开发技术解决方案 .
    JS添加可信站点、修改ActiveX安全设置,禁用弹出窗口阻止程序的方法
    Eclipse支持HTML&JS&ExtJS&jQuery代码智能提示
    如何在Web上判断是否已经安装了某个ActiveX控件
    去掉Eclipses的鼠标悬浮提示和增加输代码提示
    在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
    Java集合类ArrayList循环中删除特定元素
  • 原文地址:https://www.cnblogs.com/unflynaomi/p/4596256.html
Copyright © 2020-2023  润新知