思路:
二分查找就是每次取中间值,然后每次就可以减少一半的数据规模,从而达到 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;
// }
//}