所以我在Java中实现了插值搜索算法:
public static boolean search(int key, int[] array) {
int low = 0, high = array.length - 1;
int middle = -1;
while(low <= high) {
middle = low + (((high - low) / (array[high] - array[low])) * (key - array[low]));
if(array[middle] == key)
return true;
else {
if(array[middle] < key)
low = middle + 1;
else
high = middle - 1;
}
}
return false;
}
它适用于数组范围内的值,总是返回true,但是对于数组范围之外的值,它不起作用(即如果我有1-15的元素列表,则值0和16不会我得到一个ArrayIndexOutOfBoundsException
)。
我似乎无法从调试器中弄清楚我哪里出错了。
谢谢!
答案 0 :(得分:3)
问题是key
变量用于计算middle
,因此必须在检查循环之前验证它是否低于最低值且高于高值在数组中:
while((array[high] != array[low] && key >= array[low] && key <= array[high]))
如果该语句为false,那么不需要进入循环内部,因为您知道该键不在数组内部(因为数组已排序)。
同时检查Wikipedia上的实施情况。