测试代码:
public class Demo01 {
public int search(int[] nums,int target){
int L = 0,R = nums.length-1;
while (L<=R){
int M = L + (R - L)/2;
if(nums[M] == target){
return M;
}else if (nums[M] < target){
L = M+1;
}else {
R = M-1;
}
}
return -1;
}
public int search2(int[] nums,int target){
int L = 0,R = nums.length-1;
while (L<=R){
int M = L + (R - L)>>1;
if(nums[M] == target){
return M;
}else if (nums[M] < target){
L = M+1;
}else {
R = M-1;
}
}
return -1;
}
public static void main(String[] args) {
//除法
long startTime1=System.nanoTime(); //获取开始时间
Demo01 d = new Demo01();
System.out.println(d.search(new int[]{-1, 0, 3, 5, 9, 12}, 2));
long endTime1=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns");
//移位操作
long startTime2=System.nanoTime(); //获取开始时间
System.out.println(d.search2(new int[]{-1, 0, 3, 5, 9, 12}, 2));
long endTime2=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime2-startTime2)+"ns");
}
}
执行代码时发现使用移位操作直接超时,且程序一直处于运行态。
所以换了简单的测试代码
long startTime1=System.nanoTime(); //获取开始时间
System.out.println(4/2);
long endTime1=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns");
//移位操作
long startTime2=System.nanoTime(); //获取开始时间
System.out.println(4>>1);
long endTime2=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime2-startTime2)+"ns");
发现移位操作确实比出发操作的效率要高,最后通过debug发现
问题出在
//serach 一中
int M = L + (R - L)/2;
//search2中
int M = L + (R - L)>>1; //这里先进行了加法操作后,再进行移位操作。所以造成了死循环。
因此度娘看了一眼简单运算符的优先级
所以,在编程中防止出现由于运算符优先级问题,可使用括号()代表优先级!!!
这可是最早接触的知识点,没想到在这栽了坑。
于是乎,在更正错误后执行结果如下: