/*
*使用二分查找有两个必要的前提:
*1.数组有序且知道数组的排序状态:或正序(从小到大)或逆序(从大到小)
*2.数组内无重复元素
*/
/*我们来看一个例子:小明从1-10内想了一个数,小红来猜这个数是几。
*小红从猜测次数最少的角度出发:每次只猜已经确定了范围的的中间值
*举个例子:在闭区间[5-11]上,则猜(5+11)/2 = 8
* 若闭区间[5,10],则猜(5+10)/2 = 7 (向下取整,这里是7.5向下取整即为7)
*之后通过小明反馈猜的数和想的数的大小关系,来确定下一个闭区间的范围
*直至猜出这个数。
*/
/*
*从一个有序数组array利用下角标闭查找一个元素
*我们知道第一个元素的角标是0,最后一个元素的角标是:[ sizeof(array) / sizeof(a[0])] - 1
*为了便于表述,用left来表示左侧闭区间的角标值,right表示右侧闭区间的角标值
*用middle来表示中间的角标值,即 middle = (left + right)/2
*按照上面例子的思路,我们可以写出以下代码:
*这里的array数组已经从小到大排序完毕。
*/
while(left <= right){
int middle = (left + right)/2;
if(array[middle]>target){right = middle - 1;}
else if(array[middle]<target){left = middle +1;}
else {return middle;}
}
/*
*变量名解释:
*left表示左侧闭区间的值,即[a,b]中的a
*right表示右侧闭区间的值,即[a,b]中的b
*middle表示闭区间中间的值,即(a+b)/2
*array表示一个数组
*target表示需要找到的数
*注意:left、right、middle均表示角标。
*/