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;
    }
  • 相关阅读:
    Spring(九)Spring中的两种自动代理
    Spring(八)Spring错题总结
    Spring(七)Spring中的四种增强和顾问
    SourceTree使用git
    Idea集成git
    SpringMVC--AbstractController抽象类限定请求提交
    SpringMVC处理器配置方式
    SpringMVC静态资源无法访问解决方案
    SpringMVC--视图解析器
    HandlerMapping执行流程
  • 原文地址:https://www.cnblogs.com/fanyong/p/3125390.html
Copyright © 2011-2022 走看看