zoukankan      html  css  js  c++  java
  • 二分查找

    介绍

    二分查找,又称折半查找,二分搜索,是一种在有序数组中查找某一特定元素的算法。优点是比较次数少,查找速度快,平均性能好;缺点是要求待查数组有序,且插入删除困难。因此二分查找适合于那些不经常变动而查找频繁的的有序列表。

    假设数组中元素是有序的,搜索过程首先从数组的中间开始,如果中间元素刚好是要查找的元素,则搜索过程结束;否则利用中间位置记录的元素将数组分成前后两个字数组,如果某一特定元素大于或者小于中间元素,则在数组中大于或者小于中间元素的那一半查找,也从数组中间元素开始比较,重复以上步骤。

    虽然第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现.

    复杂度分析

    因为二分搜索算法每一步都使搜索范围缩小一半,所以很明显时间复杂度是O(logn)

    代码

    二分查找在算法大家庭中属于"分治法",分治法基本都可以使用递归来实现。

    递归实现如下:

    public static int Binary_Search_R(int[] srcArray,int low,int high, int target)
    {
        if (low > high)
            return -1;
            
        int mid = (low + high) / 2;
        if (target = srcArray[mid])
            return mid;
        if (target < srcArray[mid])
            return Binary_Search_R(srcArray, low - 1, high, target);
        if (target > srcArray[mid])
            return Binary_Search_R(srcArray, low + 1, high, target);
    }

    非递归实现:

    /// <summary>
    /// 二分查找算法
    /// </summary>
    /// <param name="srcArray">有序数组</param>
    /// <param name="dest">要查找的元素</param>
    /// <returns>dest的数组下标,没找到返回-1</returns>
    public static int BinarySearch(int[] srcArray,int dest)
    {
        int low = 1;
        int high = srcArray.Length - 1;
    
        while (low <= high)
        {
            int middle = (low + high) / 2;
    
            if (dest == srcArray[middle])
            {
                return middle;
            }
            else if (dest < srcArray[middle])
            {
                high = middle - 1;
            }
            else
            {
                low = middle + 1;
            }
        }
    
        return -1;
    }
  • 相关阅读:
    Ubuntu下虚拟机卡顿
    C函数重载
    ACPI电源状态定义
    /dev/random生成随机数慢的问题
    GCC强制静态库链接未使用的函数、变量
    cmake交叉编译问题
    cmake语法
    CentOS安装OpenOCD
    LOJ3119. 「CTS2019 | CTSC2019」随机立方体 二项式反演
    BZOJ4710 [Jsoi2011]分特产 容斥
  • 原文地址:https://www.cnblogs.com/fanyong/p/3125390.html
Copyright © 2011-2022 走看看