package day15;
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 = insertvaluesearch(arr, 0, arr.length-1 , 20);
System.out.println(i);
}
public static int insertvaluesearch(int[] arr,int left,int right,int findval){
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 insertvaluesearch(arr,left,mid-1,findval);
}else if (findval<midval){
// 找的值小于中间值,向右递归
return insertvaluesearch(arr,mid+1,right,findval);
}else {
// 找到了对应的值,返回。
return mid;
}
}
}
将二分查找的int mid =(right+left)/2 换为 int mid=left+(right-left)*(findval-arr[left])/(arr[right]-arr[left]);
数据量大,关键字分布均匀用插值查找。