//二分查找法右开区间
public void testApp4() {
//查找范围
int[] arr = new int[100000000];
for (int i = 1; i <= 99999999; i++) {
arr[i-1] = i;
}
//查找目标
int target = -59469999;
//初始化左右边界
int i=0,j=arr.length;//j只参与界限判断,不参与计算
long Start=System.nanoTime();//开始时间
//初始化中间值
while (i<j){
//设中间值索引
int m=(i+j)>>>1;
if(arr[m]<target){
i=m+1;//目标大于中间数,排除左边查找范围
}else if (target<arr[m]){
j=m;//目标小于中间数,排除右边范围,由于前面j取的是超出索引的开区间,所以这里不用-1
}else{
long End=System.nanoTime();//结束时间
System.out.println("找着了,索引为:"+m);//命中则输出索引,程序结束
System.out.println("耗时:"+(End-Start)/Math.pow(10,6)+"ms");//耗时
return;//结束程序
}
}
//未命中则输出-1
System.out.println("未找到,-1");
long End=System.nanoTime();//结束时间
System.out.println("耗时:"+(End-Start)/Math.pow(10,6)+"ms");//耗时
}
我们来看一下效果,这次应该是找不到的:
改为59469999 后应该是能找得到的,运行下效果:
OK