二分查找

介绍

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

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

虽然第一篇二分搜索论文在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;
}
原文地址:https://www.cnblogs.com/fanyong/p/3125390.html