插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。 将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right. key 就是前面我们讲的 findVal ;int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/*插值索引*/ 对应前面的代码公式: int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])
package com.atgguigu.search;
import java.util.Arrays;
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;
}
// System.out.println(Arrays.toString(arr));
int i = insertValueSearch(arr, 0, 99, 100);
System.out.println(i);
}
//编写插值查找算法
//说明:插值查找算法,也要求数组是有序的
/**
*
* @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("插值查找次数");
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 midVal = arr[mid];
if(findVal > midVal){
return insertValueSearch(arr,mid+1,right,findVal);
}else if(findVal < midVal){
return insertValueSearch(arr,left,mid-1,findVal);
}else {
return mid;
}
}
}
同二分查找,查找100相比较
注:对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快. 关键字分布不均匀的情况下,该方法不一定比折半查找要好