插值查找

插值查找算法又称插值搜索算法,是在二分查找算法的基础上改进得到的一种查找算法。

插值查找算法只适用于有序序列,换句话说,它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法,当有序序列中的元素呈现均匀分布时,插值查找算法的查找效率要优于二分查找算法;反之,如果有序序列不满足均匀分布的特征,插值查找算法的查找效率不如二分查找算法。

所谓均匀分布,是指序列中各个相邻元素的差值近似相等。例如,{10, 20, 30, 40, 50} 就是一个均匀分布的升序序列,各个相邻元素的差值为 10。再比如 {100, 500, 2000, 5000} 是一个升序序列,但各相邻元素之间的差值相差巨大,不具备均匀分布的特征。

插值查找算法的解题思路和二分查找算法几乎相同,唯一的区别在于,每次与目标元素做比较的元素并非搜索区域内的中间元素,此元素的位置需要通过如下公式计算得出:

mid=left+(right-left)*(value-arr[left]) / (arr[right]-arr[left])

public class InsertSort {
public static void main(String[] args) {
int arr[] = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i+1;
}
int i = insertSort(arr, 0, arr.length-1, 88);
System.out.println("找到的索引为:"+i);
}
/*
* @param arr: 传入的数组
* @param left: 数组左边索引
* @param right: 数组右边索引
* @param findV: 要查找的值
* @return: int :查找到的下标
* return -1 :没有要查找的值
* @description: 要求数组有序 是和均匀分布的数列 例如等差数列
*/
public static int insertSort(int arr [],int left,int right,int findV){
System.out.println("调用");
if (left >right || findV < arr[0] ||findV > arr[arr.length-1]){
return -1;
}
// 找到中间元素所在的位置
int mid = left +(right-left) *(findV -arr[left])/(arr[right]-arr[left]);
int midV = arr[mid];
if (findV > midV){
return insertSort(arr,mid+1,right,findV);
}
if (findV < midV){
return insertSort(arr,left,mid-1,findV);
}
else return mid;
}
}
posted @   被动  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示