插值查找类似与二分查找,不同的是,插值查找每次从自适应mid处开始查找(即mid值取法不同),
插值查找中:mid= low + (key -arr[low]) * (height - low) / (arr[height] - arr[low])
/**
* 二分查找,递归求解
* 这里的递归实质上是可以使用while循环代替的,递归不产生回溯的情况下都是可以使用循环代替的
*
* @param arr:要查找的数组
* @param key:要查找的值
* @param left:左索引
* @param right:右索引
* @return:返回查找到值的下标
*/
public static int search(int[] arr, int key, int left, int right) {
int l = left;
int r = right;
int mid = l + (key -arr[l]) * (r - l) / (arr[r] - arr[l]);//求出自适应mid
int value = -1;
//arr[l]>key || arr[r]<key此处这两个条件是不可以省略的,若传进来的key远远大于数组的最大值,则计算出来的mid将越界
if (l <= r || arr[l] > key || arr[r] < key) {
if (key < arr[mid]) {
value = search(arr, key, left, mid - 1);
} else if (key > arr[mid]) {
value = search(arr, key, mid + 1, right);
} else {
value = mid;
}
}
return value;
}
注意:
原文:https://www.cnblogs.com/ekig/p/14726373.html