一、介绍
1、插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。
2、将折半查找中的求mid索引的公式,low表示左边索引left,high表示右边索引right. key 就是前面我们讲的 findVal
3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/
对应前面的代码公式:
int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])
4、举例说明插值查找算法 1-100 的数组
二、代码
public class InsertValueSearch {
public static void main(String[] args) {
int arr[] = {1, 8, 10, 89, 1000, 1000, 1234};
int index = search(arr, 0, arr.length - 1, 89);
System.out.println("index = " + index);
}
private static int search(int[] array, int left, int right, int key) {
while (left <= right) {
if (array[right] == array[left]) {
if (array[right] == key)
return right;
else return -1;
}
int middle = left + ((key - array[left]) / (array[right] - array[left])) * (right - left);
if (array[middle] == key) {
return middle;
}
if (key < array[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return -1;
}
三、插值查找注意事项:
- 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
- 关键字分布不均匀的情况下,该方法不一定比折半查找要好