
测试代码:
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; //这里先进行了加法 *** 作后,再进行移位 *** 作。所以造成了死循环。
因此度娘看了一眼简单运算符的优先级
所以,在编程中防止出现由于运算符优先级问题,可使用括号()代表优先级!!!
这可是最早接触的知识点,没想到在这栽了坑。
于是乎,在更正错误后执行结果如下:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)