二分查找及递归

来源:互联网 发布:windows 10sfc修复系统 编辑:程序博客网 时间:2024/06/19 01:19

原博客

#include<iostream>#include<stdlib.h>using namespace std;int BinarySearch(int arry[],int len,int value){    if(arry==NULL||len<=0)        return -1;    int start=0;    int end=len-1;    while(start<=end)//判断清是否有=    {        int mid=start+(end-start)/2;        if(arry[mid]==value)            return mid;        else if(value<arry[mid])            end=mid-1;        else            start=mid+1;    }    return -1;}//改进思路:1, 不要传参,而是传引用调用,减少垃圾            2.使用模板int BinarySearchRecursion(int arry[],int value,int start,int end){    if(start>end)        return -1;    int mid=start+(end-start)/2;    if(arry[mid]==value)        return mid;    else if(value<arry[mid])        return    BinarySearchRecursion(arry,value,start,mid-1);    else        return    BinarySearchRecursion(arry,value,mid+1,end);}int BinarySearchRecursion(int arry[],int len,int value){    //如果传入的数组为空或者数组长度<=0那么就返回-1,防御性编程    if(arry==NULL||len<=0)        return -1;    return BinarySearchRecursion(arry,value,0,len-1);}void main(){    int arry[]={1,2,3,4,5,6,7,8};    int len=sizeof(arry)/sizeof(int);    int index=BinarySearch(arry,len,4);    cout<<"index:"<<index<<endl;    int index2=BinarySearchRecursion(arry,len,9);    cout<<"index2:"<<index2<<endl;    system("pause");}/////////////////////////////////////我们可以发现这个方法中的后三个参数value,start,end采用的是传值调用,只有第一个参数array是传地//址调用。我们知道在效率方面,传值调用要比传址调用来的低,因为传值调用要进行一次变量的拷贝//,而传址调用则是直接对这个变量进行操作,因此这里我们可以将后面的三个参数改为传址调用//改进后的代码int BinarySearchRecursion(int arry[],int &value,int &start,int &end){    if(start>end)        return -1;    int mid=start+(end-start)/2;    if(arry[mid]==value)        return mid;    else if(value<arry[mid])    {        end=mid-1;        return BinarySearchRecursion(arry,value,start,end);    }    else    {        start=mid+1;        return BinarySearchRecursion(arry,value,start,end);    }}int BinarySearchRecursion(int arry[],int &len,int &value){    //\u5982\u679c\u4f20\u5165\u7684\u6570\u7ec4\u4e3a\u7a7a\u6216\u8005\u6570\u7ec4\u957f\u5ea6<=0\u90a3\u4e48\u5c31\u8fd4\u56de-1\u3002\u9632\u5fa1\u6027\u7f16\u7a0b    if(arry==NULL||len<=0)        return -1;    int start=0;    int end=len-1;    return BinarySearchRecursion(arry,value,start,end);}void main(){    int arry[]={1,2,3,4,5,6,7,8};    int len=sizeof(arry)/sizeof(int);    int especteNum1=4;    int especteNum2=9;    int index=BinarySearch(arry,len,especteNum1);    cout<<"index:"<<index<<endl;    int index2=BinarySearchRecursion(arry,len,especteNum2);    cout<<"index2:"<<index2<<endl;    system("pause");}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝一直吐怎么办 5个月宝宝一直吐怎么办 新生儿睡反了觉怎么办 吃母乳奶流量大怎么办 两个月宝宝有痰怎么办 婴儿瞌睡睡倒了怎么办 侧切伤口崩开了怎么办 脐带30天未脱落怎么办 洗眉结痂不掉怎么办 新生宝宝生殖器下面破皮怎么办 脐带未脱落渗血怎么办 车停店门口贴发单怎么办 有人要打我我该怎么办 很笨怎么办工作做不好 脸被电焊烤了疼怎么办 脸过敏痒的不行怎么办 领导想让你辞职怎么办 领导强吻我了怎么办 赫曼夏天温度高怎么办 近视看3d电影怎么办 有声挂图撕坏了怎么办 主机没有放光盘的设备怎么办 装显卡是没光驱怎么办 电脑机箱光盘总是出来怎么办 看书网作者密码忘记怎么办 电脑光驱访问出现出错怎么办 电脑不读dvd光盘怎么办 dvd光盘读不出来怎么办 光盘插在电脑里出不来怎么办 cad画斜线不光滑怎么办 ps没有魔棒工具怎么办 洗完鞋子发黄了怎么办 牛拜单车不退押金怎么办 总裁太爱我怎么办小说 小班走丢了怎么办ppt 走丢了怎么办 教案 ppt 小鸽子一大一小怎么办 烤八寸蛋糕胚表面上色严重怎么办 小班安全教案下雨打雷怎么办 幼儿园小班社会教案下雨打雷怎么办 两个月宝宝吃手怎么办