思路说明:
1.插值查找算法和二分查找很像,不同的二分查找每次比较的是中间值,而插值插值算法每次比较的是Insert值 比中间值更接近于要找的s值
2.insert推导公式如下
Mid=(left+right)/2=left+(right-left)/2 根据数学公式推导出
Insert=left+(s-a[left])*(right-left)/(a[right]-a[left])
先写一个方法
public static int insertSearch(int arr[],int s,int left,int right)
{
if (left > right || s > arr[right] || s < arr[left]) {
return -1;
}
int insert=left+(s-arr[left])*(right-left)/(arr[right]-arr[left]);
if (s<arr[insert]){
return insertSearch(arr, s, left, insert-1);
}
else if (s>arr[insert]){
return insertSearch(arr, s, insert+1, right);
}
else{
return insert;
}
}
}
然后测试
public static void main(String[] args) {
int arr[]={1,2,4,5,7,8,9};
int r = insertSearch(arr, 9, 0, arr.length - 1);
System.out.println(r);
}
这是结果图
tips:在数组较为有序的时候 插值查找的效率比二分查找高得多,假如数组数值不是很连续有时候还不如二分查找的效率