二分查找的递归实现

我在曾经的博客里写了普通版本的二分查找

           二分查找普通版本


下面我们来分析下用递归实现二分查找


首先二分查找必须为有序的数组,因为我们需要一个左边的值与右边的值来确定一个范围,同时我们需要传入的数组,还需要一个查找的数,所以一共有四个参数

接着,由于我们是对数组操作,所以首先先要判断数组是否存在。

if(array==NULL||len<0)
    return -1;

递归调用的过程,判断条件是一样的,在递归调用自身的过程中,要么改变的是左边标记,要么改变的是右边标记。

下面我们给出一个错误的代码:

#include <iostream>
using namespace std;
int BinarySearch(int* array, int left, int right, int data)
{
	if (array == NULL || data<left || data>right)
		return -1;
	if (left < right)
	{
		int mid = left + ((right - left) >> 1);
		if (array[mid] == data)
			return mid;
		else if (data < array[mid])
			BinarySearch(array, left, mid, data);
		else
			BinarySearch(array, mid + 1, right, data);
	}
	return -1;
}
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;//下标    
	cout << BinarySearch(arr, left, right, 4) << endl;
	return 0;
}

上面的代码出错在递归调用处没有合适的返回值,所以只有在4处是打印的1,既是找到了,其他的值是找不到。

因此我们加上两个return语句即可。


下面给出正确的递归实现二分查找代码:

#include <iostream>
using namespace std;
int BinarySearch(int* array, int left, int right, int data)
{
	if (array == NULL || data<left || data>right)
		return -1;
	if (left < right)
	{
		int mid = left + ((right - left) >> 1);
		if (array[mid] == data)
			return mid;
		else if (data < array[mid])
		{
			BinarySearch(array, left, mid, data);
			return 1;
		}
		else
		{
			BinarySearch(array, mid + 1, right, data);
			return 1;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;//下标    
	cout << BinarySearch(arr, left, right, 10) << endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值