插值查找
前言
在上篇文章中已经将讲解过二分查找算法,而插值查找与二分查找类似,只不过是在二分查找的基础上进行优化,讲mid的值进行了一定调整优化,将mid的值修改为,该算法时间复杂度为O(log n)。
优缺点
- 优点:对于数据量较大并且关键字分布均匀的查找表来说,采用插值查找速度更加快。
- 关键字分布不均匀的情况下,该方法不一定比二分查找好。
代码实现
/**
* 插值查找
* 说明:插值查找算法要求数组有序
* @param array 数组
* @param left 左边的索引
* @param right 右边的索引
* @param findValue 要查找的值
* @return 如果找到返回下标 否则返回-1
*/
public static int insertValueSearch(int[] array,int left,int right,int findValue)
{
count++;
//注意:findValue < array[0] || findValue > array[array.length-1] 不但能起到优化的作用,而且可以防止temp越界
if (left > right || findValue < array[0] || findValue > array[array.length-1])
{
return -1;
}
int temp = left+(right - left) * (findValue - array[left]) / (array[right] - array[left]);
int tempValue = array[temp];
if (findValue > tempValue)
{
return insertValueSearch(array, temp+1, right, findValue);
}else if (findValue < tempValue)
{
return insertValueSearch(array, left, temp-1, findValue);
}else
{
return temp;
}
}
测试
public class InsertValueSearch
{
//用于记录测试查找次数
static int count;
public static void main(String[] args)
{
int[] array = new int[100];
for (int i = 0; i < array.length; i++) {
array[i] = i+1;
}
int findValue = 78;
int index = insertValueSearch(array, 0, array.length - 1, findValue);
System.out.printf("要查找的值为%d,在序列表中的索引值为%d",findValue,index);
System.out.println("查找次数"+count);
}
}
//-----------------------------------------------------测试结果----------------------------------------------------
要查找的值为78,在序列表中的索引值为77
查找次数:1
以上。
如有不足或者错误欢迎评论指正。