插值查找原理:
其中key就是我们要查找的数,相当与在二分法中讲到的findVal。
(插值查找算法也要求数组是有序的)
代码实现
public class InsertSearch {
public static void main(String[] args) {
int [] arr = new int [100];
for(int i = 0;i < 100;i++){
arr[i] = i + 1;
}
int resIndex = insertSearch(arr,0,arr.length-1,30);
System.out.println("resIndex = " + resIndex);
}
//编写插值查找算法
public static int insertSearch(int [] arr,int left,int right,int findVal){
//当left大于right时,说明递归整个数组,但是没有找到,当大于最后一个数,小于第一个数时也表示不存在
if(left > right||findVal < arr[0]||findVal > arr[arr.length - 1]){
return -1;
}
//求出mid
int mid = left + (right - left)*(findVal - arr[left])/(arr[right] - arr[left]);
int midval = arr[mid];
if(findVal > midval){
//向右递归
return insertSearch(arr,mid+1,right,findVal);
}else if(findVal < midval){
return insertSearch(arr,left,mid+1,findVal);
}else{
return mid;
}
}
}
该方法适用于关键字分布比较均匀的集合。