菜鸟笔记
提升您的技术认知

递归之二分查找

简单查找的时间复杂度为O(n)

二分查找的时间复杂度为O(logn)

用递归实现二分查找:

  基线条件:数组只包含一个元素。如果如果要查找的值与这个元素相同,就找到了;否则说明不在数组中。

  递归条件:把数组分成两半,将其中一半丢弃,并对另一半执行二分查找。

C++代码实现如下(VS可以直接运行):

#include 

using namespace std;

//x为目标数据、left为数组第一个元素下标、right为数组最后一个元素下标
int recurBinarySearch(int* p, int x, int left, int right);

int main()
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int x = 7;
    int result;
    result = recurBinarySearch(array, x, 0, 9);
    if (result == -1)
        cout << "没找到" << endl;
    else
        cout << "在array[" << result << "]里找到" << x << endl;
}

int recurBinarySearch(int* p, int x, int left, int right)
{
    //基线条件
    if (left == right)
        return left;

    //递归条件
    if (left < right)
    {
        int mid = (left + right) / 2;  //得到中间值
        if (x < p[mid])  //小于,改变right
            return recurBinarySearch(p, x, left, mid - 1);
        else if (x > p[mid])  //大于,改变left
            return recurBinarySearch(p, x, mid + 1, right);
        else
            return mid;  //得到x
    }
    return -1;
}