您的位置:首页 > 其它

二分查找的递归实现

2017-04-14 22:57 274 查看
我在曾经的博客里写了普通版本的二分查找

          
二分查找普通版本

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



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

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: