通过二分查找的方式来寻找整个有序数组中的指定值,主要思想是引入了一个mid变量,用下标为mid的值来和要查询的key比较,如果小于key就把查询的下限变换为mid+1,如果大于key就把查询的下限变换为mid-1,直到找到指定元素或下限大于上限或上限小于下限。递归的实现方式类似,循环的将上限、下限传递到函数中,函数的边界条件就是 下限大于上限或者找到指定元素!
#include <iostream>
#include <stdlib.h>
using namespace std;
int bs_unrecursive(int *a,int length, int key) {
if (a == NULL)
return -1;
int low = 0;
int high = length - 1;
int mid = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] < key)
low = mid + 1;
else if (a[mid] > key)
high = mid - 1;
else
return mid;
}
return -1;
}
int bs_recursive(int *a,int low,int high, int key) {
if (a == NULL)
return -1;
if (low > high)
return -1;
int mid = (low + high) / 2;
if (a[mid] == key)
return mid;
else if (a[mid] < key)
return bs_recursive(a, mid + 1, high, key);
else
return bs_recursive(a, low, mid - 1, key);
}
int main()
{
int array[10];
for (int i = 0; i < 10; i++)
array[i] = i;
int length = sizeof(array) / sizeof(array[0]);
cout << "非递归实现:" << endl;
cout << "元素下标:" << bs_unrecursive(array,length, 6) << endl;
cout << "递归实现:" << endl;
cout << "元素下标:" << bs_recursive(array, 0, 9, 6) << endl;
return 0;
}
遗留问题:
- 如何跟踪递归深度?
版权声明:本文为weixin_40370744原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。