一、解决方案
给定数组:A = [1,2,3,4,5,6,7,8,9],找到其中的一个数T
- 只适用于排好序的数组
- 定义初始左边界L和有边界R
- 获取中间索引M=(L+R)/2
- 比较:
1) A[M]>T,说明中间索引在要找的数右边,把右边界R设置为中间索引的下一个M-1;
2)A[M]
- 如果L>R,表示没找到,结束循环。
二、代码
public static int BinarySearch(int[] a,int t){
int l = 0;
int r = a.length - 1;
int m;
while(l<=r){
m = (l+r)/2;
if(a[m] == t){
return m;
}
if(a[m]>t){
r = m-1;
}
if(a[m]<t){
l = m + 1;
}
}
return -1;
}
三、问题
- 如果l和r为最大整数,则在计算过程中(l+r)会溢出。
- 将m = l + (r-l)/2
四、面试题
- 给定一个排好序的数组,问查找T需要比较几次;
- 拥有128个元素的数组中二分查找,比较次数最多不超过?
2的n次方 = 128,求n (ln128)