上次写排序,查找的时候居然忘记的二分查找算法,今天就来实现,两种:递归与非递归
如果大家有什么建议,我一定多多学习!
//二分搜索算法(折半搜索算法)
//时间复杂度:O(log2n)
#include <iostream>
//非递归算法---返回数组下标
template <typename T>
int BinarySearch(T a[], const T & x, int n) //数组a[],查找x这个元素,一共有n个元素
{
int left = 0,middle,right = n - 1;
while(left <= right)
{
middle = (left + right) / 2;
if(a[middle] == x)
return middle;
else if(a[middle] > x)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
//递归算法
template <typename T>
int BinarySearch(T a[], int x, int left, int right)
{
if(left > right) //递归出口
return -1;
else
{
int middle = (left + right) / 2;
if(a[middle] == x)
return middle;
else if(a[middle] > x) //果断递归哈
return BinarySearch(a, x, left, middle - 1); //才开始少了个return
else
return BinarySearch(a, x, middle + 1, right);
}
}
int main()
{
using std::cin;
using std::cout;
using std::endl;
int a[6] = {1, 3, 8, 9, 11, 15};
int x;
while(cin >> x)
{
int i = BinarySearch(a, x, 0, 5); //这是递归的
if(i != -1)
cout << a[i] << endl;
else
cout << "FAILED!" << endl;
}
return 0;
}