我决定每天一道算法题了,题目难度要求不大。但是最起码要求代码一遍过,主要锻炼自己写代码风格和方式以及思路吧。贵在坚持吧。今天做一个最简单的二分查找题。
题目:给一个有序数组,要求用二分查找找到指定数据的索引位置。
public int binarySearchIndex(int searchData, int[] array) {
if (array == null || array.length == 0) {
return -1;
}
int low = 0;
int high = array.length - 1;
int middle;
// 确认是由小到大还是由大到小
if (array[low] < array[high]) {
// 是由小到大
while (low < high) {
// 找中间位置
middle = (high - low) / 2 + low;
System.out.println("由小到大, middle = " + middle);
if (searchData < array[middle]) {
high = middle;
high--;
continue;
} else if (searchData > array[middle]) {
low = middle;
low++;
continue;
} else {
return middle;
}
}
} else {
// 是由大到小
while (low < high) {
// 找中间位置
middle = (high - low) / 2 + low;
System.out.println("由大到小, middle = " + middle);
if (searchData < array[middle]) {
low = middle;
low++;
continue;
} else if (searchData > array[middle]) {
high = middle;
high--;
continue;
} else {
return middle;
}
}
}
return -1;
}
结果:运行是对的,但是没有做到一遍过。 出现了死循环。原因是:
1 对于middle = (high - low) / 2 + low; 这段代码,我开始使用的不是 除号,而是右移, 即 middle = (high - low) >>1 + low;这种样子,因为我知道右移一位就是代表除以2,并且速度更快。但是就是出错了,,于是我怀疑是不是我的右移用错了,或者是我记错了右移不是除以2???于是我就专门写了代码测试,发现右移一位就是除以2,这个的的确确是千真万确的。那么我的问题到底出在哪里?于是我就先试了一下除以2,发现运行结果比原先好多了。但是我就纳了闷了。为什么除以号可以右移就会死循环??很明显采用右移计算的位置并不是我想要的位置!难道是我的写法错误了?后来就抱着试试看的态度,加了一个括号改成了: middle = ((high - low) >> 1) + low; 这个样子,发现运行正常了。
但是为什么会这么不正常呢?为什么非要加括号呢?于是我想打印不加括号得到的到底是什么东东,结果惊喜就来了:
这样写的时候竟然报错!什么鬼啊。编辑器给的提示是这个:
好吧,我想可能是String操作,不认识>>到底是个什么意思吧。这个线索断掉了。那么还有木有其他的原因导致必须得加上括号才正确呢?会不会是 左移右移操作得到的其实是一个二进制?然后再用上 + 号的话 ,会不行?求教啊求教!