zoukankan      html  css  js  c++  java
  • 有序数组中的二分查找

    最近看一些算法题发现这些问题到最后落实到实现上都是编程基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解。所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远。目前应该坚持基础,打好基础,毕竟不是CS科班出身。言归正传,二分查找就是一个最基础的算法。它的时间复杂度O(logn)。分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正。

    int BinarySearch(int * a, int beg, int end, int elem)
    {
        if(beg <= end)
        {
            int mid = (beg + end ) / 2;
            if(a[mid] == elem)
            {
                return mid;
            }
            else if(a[mid] > elem)
            {
                end = mid-1;
            }
            else
            {
                beg = mid+1;
            }
            return BinarySearch(a, beg, end, elem);
        }
        else
        {
            return -1;
        }
    }
    int BinarySearchRecursive(int *a, int length, int elem)
    {
        if(a == NULL || length <=0)
        {
            return  -1;
        }
        return BinarySearch(a, 0, length-1, elem);
    }
    int BinarySearchIterator(int *a, int length, int elem)
    {
        if(a == NULL || length <=0)
        {
            return  -1;
        }
        int beg = 0;
        int end = length-1;
        int mid = 0;
        while(beg <= end)
        {
            mid = (beg + end) / 2;
            if(a[mid] == elem)
            {
                return mid;
            }
            else if(a[mid] > elem)
            {
                beg = mid + 1;
            }
            else
            {
                end = mid - 1;
            }
        }
        return -1;
    }

    这里主要注意二分查找时,两个下标的变化,以及最终结束查找的判断条件是beg>end(查找失败),或者(a[mid]==end)。时间有限,代码质量一般,轻喷。

  • 相关阅读:
    jsp表单数据添加到数据库
    javaweb 复习随笔
    [组 原]
    [组 原]
    均方差、交叉熵及公式推导
    网络安全知识网站
    docker搭建渗透环境并进行渗透测试
    SQL注入之-DECLARE时间盲注
    Apache Flink Dashboard未授权访问导致任意Jar包上传漏洞
    Dnscat2实现DNS隐蔽隧道反弹Shell
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/5652129.html
Copyright © 2011-2022 走看看