使用二分法查找的必要条件:
1、数组有序
2、注意数据类型是有范围的,不要溢出。
3、采用L+(R-L)/2表达式更合适
4、注意:start = mid +1 和 end=mid -1,防止死循环
5、数据量不可过大
1024个人,有一个人有艾滋病。需要血液检测。
如何快速找出这个人。
所有人血液都采取过来。把512个人血液混合起来
512 512 1次淘汰512个人
256 256 2次淘汰256个人
128 128 3次淘汰128个人
64
32
16
4
2
1
0 shang
1
2
。。。 zhong
1021
1022
1023 xia
#include <iostream>
using namespace std;
int main()
{
int a[128];
for(int i=0;i<128;i++)
{
a[i]=i;
}
printf("%p\n",a);
int num=333;
int shang = 0;
int xia =1023;
int zhong;
while(shang < xia )
{
zhong =(shang +xia)/2;//取一个中间值
cout<<shang<<","<<zhong<<","<<xia<<endl;
if(num =a[zhong])
{
printf("找到了");
break;//跳出循环
}
else if(num>a[zhong])
{
shang=zhong +1;
}else
{
xia =zhong -1;
}
}
return 0;
}
int binary_find(int *a,int n,int key)
{
int start =0;
int last = n-1;
int middle =(start+last)/2;
while(start<last)
{
if(a[middle]>key)
{
last = middle-1;
}
else if(a[middle]<key)
{
start = middle+1;
}
else
{
return middle;
}
middle =(start+last)/2;
}
cout<<"can not find it"<<endl;
return -1;
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,12,14,24},key=0;
for(int i=0;i <10 ;++i)
{
cout<<arr[i]<<" ";
}
cout<<endl;
cin>>key;
int n=binary_find(arr,10,key);
if(n != -1)
cout<<n<<"is"<<arr[n]<<"is to find"<<endl;
}