二分查找的递归实现
2017-04-14 22:57
274 查看
我在曾经的博客里写了普通版本的二分查找:
二分查找普通版本
下面我们来分析下用递归实现二分查找。
首先二分查找必须为有序的数组,因为我们需要一个左边的值与右边的值来确定一个范围,同时我们需要传入的数组,还需要一个查找的数,所以一共有四个参数。
接着,由于我们是对数组操作,所以首先先要判断数组是否存在。
递归调用的过程,判断条件是一样的,在递归调用自身的过程中,要么改变的是左边标记,要么改变的是右边标记。
下面我们给出一个错误的代码:
上面的代码出错在递归调用处没有合适的返回值,所以只有在4处是打印的1,既是找到了,其他的值是找不到。
因此我们加上两个return语句即可。
下面给出正确的递归实现二分查找代码:
二分查找普通版本
下面我们来分析下用递归实现二分查找。
首先二分查找必须为有序的数组,因为我们需要一个左边的值与右边的值来确定一个范围,同时我们需要传入的数组,还需要一个查找的数,所以一共有四个参数。
接着,由于我们是对数组操作,所以首先先要判断数组是否存在。
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; }
相关文章推荐
- 二分查找递归实现
- 二分查找的递归和非递归实现
- 二分查找的递归与迭代实现
- 使用c语言指针和递归方法实现二分查找
- 二分查找非递归实现--【编程珠玑】
- 二分查找算法递归实现
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 二分查找 递归实现 和 循环实现
- 二分查找的递归与非递归实现
- Java实现折半查找(二分查找)的递归和非递归算法
- Java实现折半查找(二分查找)的递归和非递归算法
- 二分查找的递归和非递归实现
- 漫谈递归:二分查找算法的递归实现
- 二分查找递归与非递归实现
- Java实现折半查找(二分查找)的递归和非递归算法
- 用递归实现的二分查找
- Java实现折半查找(二分查找)的递归和非递归算法
- Java实现折半查找(二分查找)的递归和非递归算法
- C语言实现 二分查找数组中的Key值(递归和非递归)
- 二分查找递归实现--【编程珠玑】