一.简介
插值查找是根据查找关键字与查找表中最大、最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。根据开始、结束索引、查找值提前预判查找值可能的位置。
二.实现
package com.vincent;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception{
int[] arr = new int[32];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 100);
}
System.out.println(Arrays.toString(arr));
quickSort(arr,0,arr.length);
System.out.println(Arrays.toString(arr));
System.out.println(insertSearch(arr,0,arr.length,22));
}
public static void quickSort(int[] arr,int startIndex,int endIndex){
int base = arr[startIndex];
int left = startIndex,right=endIndex-1;
while(left < right){
while(left < right && arr[right] >= base){
right--;
}
arr[left] = arr[right];
while(left < right && arr[left] < base){
left++;
}
arr[right] = arr[left];
}
arr[left] = base;
if(left - startIndex > 1){
quickSort(arr,startIndex,left);
}
if(endIndex - left > 1){
quickSort(arr,left+1,endIndex);
}
}
public static int insertSearch(int[] arr,int startIndex,int endIndex,int dst){
//二分查找
//int mid = (startIndex + endIndex)/2;
//插值查找
int mid = startIndex + (dst-arr[startIndex])*(endIndex-startIndex)/(arr[endIndex-1]-arr[startIndex]);
if(mid>=endIndex || mid<startIndex){
return -1;
}
if(arr[mid] == dst){
return mid;
}
else if(arr[mid] < dst){
return insertSearch(arr,mid+1,endIndex,dst);
}
else{
return insertSearch(arr,startIndex,mid-1,dst);
}
}
}
效果:
三.总结
插值查找在二分查找基础上实现,通过预先判断查找数据的可能性提高数据查找效率。