本文内容来源于《编程珠玑》第二版5.2节。
先看一段程序:
public class ErrirBinary {
static int array[] = new int[] { 0, 1, 2, 3, 4 };
public static int BinarySearch(int number) {
int start = 0, middle, end = 4;
while (start <= end) {
middle = (start + end) / 2;
if (array[middle] < number)
start = middle;
else if (array[middle] > number)
end = middle;
else
return middle;
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
for (int i = 0; i < 5; i++)
System.out.println(i + "在数组中的位置是: " + BinarySearch(i));
}
}
这段程序的输出如下:
0在数组中的位置是: 0
1在数组中的位置是: 1
2在数组中的位置是: 2
3在数组中的位置是: 3
显然没有找到4在数组中的位置,边界条件无法通过测试。
下面通过添加脚手架的方式进行跟踪测试:
public class ErrirBinary {
static int array[] = new int[] { 0, 1, 2, 3, 4 };
public static int BinarySearch(int number) {
int start = 0, middle, end = 4;
while (start <= end) {
middle = (start + end) / 2;
<strong>System.out.println(start + " " + middle + " " + end);//所谓脚手架</strong>
if (array[middle] < number)
start = middle;
else if (array[middle] > number)
end = middle;
else
return middle;
}
return -1;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(4 + "在数组中的位置是: " + BinarySearch(4));
}
}
看一下输出:
0 2 4
2 3 4
3 3 4
3 3 4
3 3 4
……………………
很显然当start=3 ,end=4的时候程序陷入了死循环。
而修改方法很简单
把
if (array[middle] < number)
start = middle;
else if (array[middle] > number)
end = middle;
修改为
if (array[middle] < number)
start = middle + 1;
else if (array[middle] > number)
end = middle - 1;
即可。