引例
A心里想一个1-1000之间的数,B来猜,可以问问题,A只能回答是或否。怎么猜才能问的问题次数最少?
- 顺序查找:是1吗?是2吗? …是999吗?平 均要问500次
- 二分查找:大于500吗?大于750吗?大于625吗? … 每次缩小猜 测范围到上次的一半,只需要10次
- 二分查找的 内容必须是有序的 。
例1:在数组 a 中查找元素 p
题目描述
写一个函数BinarySeach,在包含size个元素的、从小到大排序的int数组a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1。要求复杂度O(log(n))。
代码
int BinarySeach(int a[],int size,int p){
int L = 0; //查找区间的左端点
int R = size - 1; //查找区间的右端点
while(L <= R){
//如果查找区间不为空就继续查找
int mid = L+(R-L)/2; //取查找区间正中元素的下标
if(p == a[mid])
return mid;
else if