一 —导读
插值查找可以说是二分查找的优化版,当 数组特别大的时候,在找相同元素的时候,插值查找所消耗的时间和算法调用次数是远低于二分查找的。
如果我们数组是{1, 2, 3, 4, 5, 6, 7, 8, 9 ,10, 11, 12, 13, 14, 15, 16, 17, 18}
加入我们现在要找1,虽然也能找到。但是耗费的时间长。
二—算法思路
1)类似于二分查找。不同的是每次从自适应mid处开始查找 。
2)将二分查找中的求mid索引的公式改为下面这个威力巨大的公式。
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left])
三–插值算法举例
数组arr= { 1, 2, 3, …,100};
假如我们查找的值是1,使用二分查找需要多次递归才能找到1.
使用插值查找算法:
int mid = 0 + (99 - 0) * (1 - 1) / (100 - 1) = 0;
一下就定位到1
比如我们查找的值是100;
int mid = 0 + (99 - 0) * (100 - 1) / (100 - 1) = 99.
一下就定位到要找的100.
四—代码实现
// 编写插值查找算法
// 说明:插值查找算法也要求数组是有序的
/**
*
* @param arr 数组
* @param left 左边的下标
* @param right 右边的下标
* @param findVal 查找的值
* @return 如果找到就返回对应的下标,没找到返回-1
*/
public static int insertValueSearch(int[] arr, int left, int right, int findVal