插值算法的前提是有序的,和二分查找很像,只是在定义mid的值,二分是不断折半,插值是通过公式计算得来的,可以一次找到。
注意事项:
在数据量大的情况且关键字分布均匀时速度很快
关键字分布不均匀不一定比这半查找快
代码实现:
package chazhao;
import java.util.Arrays;
public class InsertValueSearch {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i + 1;
}
int i = insertVal(arr, 0, arr.length - 1, 1);
System.out.println(i);
}
public static int insertVal(int[] arr, int left, int right, int num) {
if (left > right || num < arr[left] || num > arr[right]) return -1;
int mid = left + (right - left) * (num - arr[left]) / (arr[right] - arr[left]);
int minVal = arr[mid];
if (num > minVal) {
//右
return insertVal(arr, mid + 1, right, num);
} else if (num < minVal) {
return insertVal(arr, left, mid - 1, num);
} else {
return mid;
}
}
}