• 二分查找法


    在面试的时候二分查找是用的比较多一种查找算法,如何在面试官面前快速准确得的写出代码决定你是否能够被录取。以前一直以为二分查找很简单,所以就没怎么重视,但是真要在面试官面前对着黑板手写出来,还是漏洞百出。今天自己在电脑面前敲出了二分查找的代码,也花了将近半个小时。对于这种基础排序查找算法,还是得好好重视。

    1. 二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
    2. 二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。
    3. 二分查找的主要思路就是设定两个指针start和end分别指向数组元素的收尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明带查找元素在数组的前半段,那么将end=mid-1,如果待查找元素大于中间元素,那么表明该元素在数组的后半段,将start=mid+1;如果中间元素等于待查找元素,那么返回mid的值。
        //不适用递归,如果存在返回数组位置,不存在则返回-1
    int BinarySearch(int arry[],int len,int value)
    {
    //如果传入的数组为空或者数组长度<=0那么就返回-1。防御性编程
    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");
    }
    改进后的代码实例如下:

    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)
    {
    //如果传入的数组为空或者数组长度<=0那么就返回-1。防御性编程
    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");
    }


  • 相关阅读:
    InetAddress.getLocalHost().getHostAddress() 问题
    解决:Element ‘dependency‘ cannot have character [children], because the type‘s content type is elementon
    生成二维码下载二维码
    Spring boot 如何获得客户端 ip 地址以及根据主机名获得 ip 地址
    无法打开到主机的连接。 在端口 23: 连接失败
    在vue的项目中怎样修改浏览器窗口的 logo
    解决:SqlSession[xxx] was not registered for synchronization because synchronization is not active
    解决:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
    [docker]在本地/内部配置部署docker镜像仓库
    1
  • 原文地址:https://www.cnblogs.com/jimmy-muyuan/p/5837980.html
Copyright © 2020-2023  润新知