下面带来Java版本插值查找算法的实现,本篇一些概念沿用上一篇博客,如数组左索引为left,右索引为right。先说明一下,插值查找算法要求待查找的数组为有序的。
插值查找原理:
1.插值查找算法类似于二分查找,不同的是插值查找每次从只适应的mid处开始查找;
2.在二分查找中,求mid的公式为:
插值算法将求mid的公式改进为:
对应的代码为:int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left])
代码实现:
public class InsertValueSearch {
public static void main(String[] args){
int[] arr = new int[100];
for(int i=0; i< arr.length; i++){
arr[i]= i + 1;
}
int index = insertValueSearch(arr, 0, arr.length-1, 100);
System.out.println("查找的索引为:" + index);
}
/**
*
* @param arr 数组
* @param left 左索引
* @param right 右索引
* @param findVal 要查找的值
* @return 返回所找到值的索引,如果没有则返回-1
*/
public static int insertValueSearch(int[] arr, int left, int right, int findVal){
System.out.println("插值算法被调用");
//findVal < arr[0] 与findVal > arr[arr.length-1] 必须要写,不然假如findVal过大时,容易导致mid 越界
if(left > right || findVal < arr[0] || findVal > arr[arr.length-1]){
return -1;
}
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
int res = arr[mid];
if(findVal > res){
//向右递归
return insertValueSearch(arr, mid + 1, right, findVal);
}else if(findVal < res){
return insertValueSearch(arr, left, mid - 1, findVal);
}else{
return mid;
}
}
}
当查找数值100时,方法只调用了一次,就可以找到100的索引。结果如下图所示:
插值查找注意事项:
1.对于数据量大,关键字(数值)分布比较均匀的查找表来说,采用插值查找,速度较快
2.关键字分布不均匀(数值的跳跃性很大)的情况下,该方法不一定比二分法查找要好