一、解决方案
给定数组: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)
