思路:

二分查找就是每次取中间值,然后每次就可以减少一半的数据规模,从而达到 O(log2 n)的时间复杂度。

#include <iostream>
using namespace std;

int find(int [],int,int,int);
void output(int a[],int begin,int end);

int main(void){
	int arr[10] = {1,3,5,7,9,11,13,15,19,20};

	int count = find(arr,0,9,20);
	printf(count == -1 ? "查询失败!": "次数:%d\n",count);
	return 0;
} 
// 普通的循环实现
int find(int a[],int begin,int end,int data)
{
	int count = 0;
	int mid = (begin + end) / 2;
	while(begin <= end && a[mid] != data)
	{
		count ++;
		if(a[mid] > data)
		{
			end = mid - 1;
		}
		if(a[mid] < data)
		{
			begin = mid + 1;
		}
		mid = (begin + end) / 2;
	}
	return a[mid] == data ? count : -1;
}

void output(int a[],int begin,int end){
	for(int i = begin;i <= end;i ++){
		cout << a[i] << " ";
	}
	cout << endl;
} 
// 采用递归
//int find(int a[],int begin,int end,int data)
//{
//	system("pause");
//	
//	if(begin <= end)
//	{
//		int mid = (begin + end) / 2;
//		cout << "begin=" << begin << " " << "mid=" << mid  << " " << "end="<< end << endl;
//		output(a, begin,  end);
//		if(a[mid] > data)
//		{
//			return find(a,begin,mid,data);
//			//return find(a,begin,mid - 1,data);
//		}
//		if(a[mid] < data)
//		{
//			return find(a,mid,end,data);
//			//return find(a,mid + 1,end,data);
//		}
//		return mid;
//		
//	}
//	else{
//		return -1;
//	} 
//}