二分查找算法

Posted Young_For_You

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找算法相关的知识,希望对你有一定的参考价值。

二分查找法:

二分查找法主要是解决在“一堆数中找出指定的数”这类问题。

而想要应用二分查找法,这“一堆数”必须有一下特征:

  • 存储在数组中
  • 有序排列

所以如果是用链表存储的,就无法在其上应用二分查找法了。(曽在面试被问二分查找法可以什么数据结构上使用:数组?链表?)

至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况,我们还是希望并假设数组是递增排列,数组中的元素互不相同。

算法图解:

 

 

递归实现:

template <typename T>
int BinarySearch(const T* arr, int start, int end, const T& value)
{
    if (start<=end)
    {
        int middle = (end - start) / 2 + start;
        if (arr[middle] < value)
        {
            start = middle + 1;
            return BinarySearch(arr, start, end, value);
        }
        else if (arr[middle] > value)
        {
            end = middle - 1;
            return BinarySearch(arr, start, end, value);
        }
        else
            return middle;
    }
    return -1;
}

 

非递归实现:

 

template <typename T>
int BinarySearchWhithoutRecursion(const T* arr, int start, int end, const T& value)
{
    int middle;
    while (start <= end)
    {
        middle = (end - start) / 2 + start;
        if (arr[middle]>value)
            end = middle - 1;
        else if (arr[middle] < value)
            start = middle + 1;
        else
            return middle;
    }
    return -1;
}

 

 

 

 这个是我自己对二分查找应用的一些总结:

 http://www.cnblogs.com/shihaochangeworld/p/5502190.html

 

 

 这博客讲解二分查找非常详细:

http://www.cnblogs.com/QG-whz/p/5194627.html

 

以上是关于二分查找算法的主要内容,如果未能解决你的问题,请参考以下文章

Golang示例学习2---二分查找法

java,二分查找法,网上查阅

算法:二分查找法

java 二分查找法

二分查找算法

算法篇——二分查找法(折半查找法)