二分查找算法的时间复杂度为o(log2(n))。
#include <iostream>
using namespace std;
typedef int ElementType;
int binarySearch_recursive(ElementType a[], ElementType e, int begin, int end)
{
if(begin > end) return -1;
// int midIndex = (begin + end) / 2;
// int midIndex = begin + (end - begin) / 2;
int midIndex = begin + ((end - begin) >> 1);//recommended
// if (e == a[midIndex]) return midIndex;
// else if (e < a[midIndex]) return binarySearch_recursive(a, e, begin, midIndex-1);
// else return binarySearch_recursive(a, e, midIndex+1, end);
return midIndex = (e == a[midIndex]) ? midIndex * (a[midIndex] == e) + (a[midIndex] != e)*(-1) :
((e < a[midIndex]) ? binarySearch_recursive(a, e, begin, midIndex - 1) : binarySearch_recursive(a, e, midIndex + 1, end));
}
int binarySearch_nonRecursive(ElementType a[], ElementType e, int num)
{
int begin = 0, end = num - 1, midIndex;
while( begin <= end )
{
midIndex = begin + ((end - begin) >> 1);
if(e == a[midIndex]) return midIndex;
else if(e < a[midIndex]) end = midIndex - 1;
else begin = midIndex + 1;
}
return -1;
}
int main(int argc, char *argv[])
{
int a[] = {1, 3, 4, 5, 7, 9};
int len = sizeof(a)/sizeof(a[0]);
cout << binarySearch_recursive(a, 5, 0, len - 1) << endl;
cout << binarySearch_nonRecursive(a, 5, len) << endl;
return 0;
}