当我们的数组是一个从1到100的有序数组的时候,况且这个时候需要查找的是1,使用二分查找的话,很显然是比较麻烦的。这个时候就要使用到插值查找。
插值查找算法类似于二分查找,不同的是插值查找每次从自适应middle处开始查找。自适应的middle的计算如下:
public class chenmain{
public static void main(String[] args) {
int [] arr = new int [100];
for(int i=0;i<100;i++)
{
arr[i]=i+1;
}
int res=insert(arr,10,0,arr.length-1);
System.out.println(res);
}
public static int insert(int[] arr, int value, int left, int right) {
//定义不满足条件的情况。
System.out.println("===");
if (left > right || value < arr[0] || value > arr[arr.length - 1]) {
return -1;
}
// 求出middle
int middle = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);
int middlevalue = arr[middle];
if (value > middlevalue) {
//向右递归
return insert(arr, value, middle + 1, right);
} else if (value < middlevalue) {
//向左递归
return insert(arr, value, left, middle - 1);
} else {
return middle;
}
}
}
注意点 :
对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.
关键字分布不均匀的情况下,该方法不一定比折半查找要好
CSDN:查找算法——插值查找(Java实现)