BinarySearch 不会结束
BinarySearch won't end
所以基本上,我知道对有序列表执行二进制搜索只是为了它起作用,所以这是我正在使用的列表:
Integer[] x = {1, 2, 3, 4, 5, 6};
所以基本上它可以找到一个整数,但是当我输入一个不在列表中的值时,它似乎并没有结束!这是我的代码:
public static <K extends Comparable<K>> boolean binarySearch(K[] list, K item) {
int start = 0;
int last = list.length - 1;
while(start <= last) {
int middle = (start + last) / 2;
if(list[middle].equals(item))
return true;
else {
if(item.compareTo(list[middle]) < 0)
last = middle--;
else
start = middle++;
}
}
return false;
}
罪魁祸首是 last = middle--;
和 start = middle++;
。
Post-递增和post-递减运算符return操作数的前一个值,而不是更新后的值。因此,当您调用 last = middle--;
时,这将有效地将 middle
减 1,并将 last
设置为 middle
, 而不是 middle-1
.
假设您搜索 7 以了解它为何进入无限循环。该项目始终位于中间元素之后,因此 start
设置为 middle
,最终将成为数组的最后一个元素。但是由于start = middle
,总是小于等于last
;因此你永远不会退出。我们已经达到了 start = last = middle
反复并且永远无法退出的状态。
在这里,您不应该使用这些运算符:当要搜索的项目在中间元素之前时,让 last = middle-1;
;当要搜索的项目在中间元素之后时,令 start = middle+1;
.
问题出在您确定 middle
的部分。在 start = 4
、last = 5
的情况下,middle
将始终是 4
。在像这样的所有情况下都会发生无限循环,其中 .5
被截断,因为这是一个 int
.
如果您不想,则无需实现自己的二分查找算法。可能感兴趣的Arrays class provides several different implementations and chances are that you will find a suitable implementation there. For the examples mentioned there is one for int[]
int binarySearch(int[] a, int key) and one for generic objects int binarySearch(T[] a, T key, Comparator c)。
所以基本上,我知道对有序列表执行二进制搜索只是为了它起作用,所以这是我正在使用的列表:
Integer[] x = {1, 2, 3, 4, 5, 6};
所以基本上它可以找到一个整数,但是当我输入一个不在列表中的值时,它似乎并没有结束!这是我的代码:
public static <K extends Comparable<K>> boolean binarySearch(K[] list, K item) {
int start = 0;
int last = list.length - 1;
while(start <= last) {
int middle = (start + last) / 2;
if(list[middle].equals(item))
return true;
else {
if(item.compareTo(list[middle]) < 0)
last = middle--;
else
start = middle++;
}
}
return false;
}
罪魁祸首是 last = middle--;
和 start = middle++;
。
Post-递增和post-递减运算符return操作数的前一个值,而不是更新后的值。因此,当您调用 last = middle--;
时,这将有效地将 middle
减 1,并将 last
设置为 middle
, 而不是 middle-1
.
假设您搜索 7 以了解它为何进入无限循环。该项目始终位于中间元素之后,因此 start
设置为 middle
,最终将成为数组的最后一个元素。但是由于start = middle
,总是小于等于last
;因此你永远不会退出。我们已经达到了 start = last = middle
反复并且永远无法退出的状态。
在这里,您不应该使用这些运算符:当要搜索的项目在中间元素之前时,让 last = middle-1;
;当要搜索的项目在中间元素之后时,令 start = middle+1;
.
问题出在您确定 middle
的部分。在 start = 4
、last = 5
的情况下,middle
将始终是 4
。在像这样的所有情况下都会发生无限循环,其中 .5
被截断,因为这是一个 int
.
如果您不想,则无需实现自己的二分查找算法。可能感兴趣的Arrays class provides several different implementations and chances are that you will find a suitable implementation there. For the examples mentioned there is one for int[]
int binarySearch(int[] a, int key) and one for generic objects int binarySearch(T[] a, T key, Comparator c)。