对应前面的代码公式:mid = left + (indValue - arr[right])/(arr[right]-arr[left])*(right-left)
一步定位
代码实现
package com.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;
// }
int[] arr = {1,8,10,89,1000,1234};
int i = insertValueSearch(arr, 0, arr.length - 1, 1234);
System.out.println(i);
}
//编写插值查找算法
//插值查找算法,也要求数组是有序的
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param findValue 查找的值
* @return 如果找到就返回对应的下标
*/
public static int insertValueSearch(int[] arr,int left,int right,int findValue){
System.out.println("我被调用了--");
// findValue<arr[0]和findValue>arr[99]是必须需要的,否则我们得到的mid的值可能越界
if (left>right || findValue<arr[0] || findValue>arr[arr.length-1]){
return -1;
}
int mid = left + (right-left)*(findValue-arr[left])/(arr[right]-arr[left]);
int midVal = arr[mid];
if (findValue>midVal){//说明向右边递归
return insertValueSearch(arr,mid+1,right,findValue);
}else if (findValue<midVal){//向左递归查找
return insertValueSearch(arr,left,mid-1,findValue);
}else {
return mid;
}
}
}
注意事项
1、对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快。
2、关键字分布不均匀的情况下,该方法不一定比折半查找要好。