刚开始以为是2^7<154<2^8 所以 <=8的就都对。
后面自己画图试了试,以为最大次数是7(没考虑到不存在的情况),特此写代码求证。下面附上代码:
private static int half(int[] arr, int num) {
int min = 0;
int max = arr.length-1;
int times = 0;
while(min <= max) {
int medim = (min+max) /2;
System.out.println(min +" " + medim+ " "+ max);
if(arr[medim] == num) {
++times;
System.out.println(times);
return medim;
}
if(arr[medim] < num) {
++times;
min = medim+1;
} else if(arr[medim] > num) {
++times;
max = medim-1;
}
}
System.out.println(times);
return -1;
}
public static void main(String[] args) {
int[] arr = new int[154];
for(int i=0; i<arr.length;i++) {
arr[i] = i+1;
}
int index = half(arr, 342);
System.out.println(index);
}
下面是执行结果:每一条表示比较的数组的最小值、中间值、最大值。最后是比较次数和索引位置。
0 76 153
77 115 153
116 134 153
135 144 153
145 149 153
150 151 153
152 152 153
153 153 153
8
-1