插值查找算法(代码实现)
这里我们将插值查找算法归纳为一个方法,然后将方法给出(代码如下:)
/**
* 插值查找算法(使用自适应的mid)
*/
//这里我们是要使用递归来实现插值查找的,所以这个时候我们的方法的形参位置一定要有int left 和 int right,因为我们递归的依据就是通过left和right进行递归的
public static int insertValSearch(int[] arr,int left,int right,int 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 midVal = arr[mid];
if(findVal > midVal){
return insertValSearch(arr,mid + 1,right,findVal);
}else if(findVal < midVal){
return insertValSearch(arr,left,mid - 1,findVal);
}else{
//表示找到了,此时直接返回mid即可
return mid;
}
}
- 以上就是我们的插值查找算法
下面这里我们对我们编写的插值查找算法进行一个测试:
/**
* 对插值查找算法进行一个测试:
*/
@Test
public void test2(){
int [] arr = {1,3,4,5,8,9,14,300,349};
int i = Search.insertValSearch(arr, 0, arr.length - 1, 9);
System.out.println(i);
int i1 = Search.insertValSearch(arr,0,arr.length - 1,1000);
System.out.println(i1);
}
插值查找注意事项:
-
对于数据量比较大的,关键字分布比较均匀的查找表来讲,我们采用插值查找效率比较高
-
但是对于关键字分布不均匀的情况之下,插值查找算法并不一定比折半查找要好
- 这里的不均匀指的指的是跳转很大的情况 , 一般情况之下我们的插值查找算法的效率还是比我们的折半查找要高的