插值查找算法
程序员文章站
2022-03-05 16:22:00
...
原来我们二分查找算法的时候是 sta+1/2(end-sta)
现在这个插值是 sta+(value-arr[sta])/arr[end]-arr[sta]* (end-sta)
通过比较,其实就是前边的 1/2变成了 那个值-最小值在最大值-最小值的比例
注意:退出的条件。
这个也必须是有序的,在数组中的数据如果之间的绝对值比较小。查找速度是比较快的,如果 间隔很大,速度不一定比二分查找快。
package a;
public class InsertSearch {
static int count;
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 11, 22, 33, 44, 55, 66, 77, 99};
int sta = 0;
int end = arr.length-1;
int value = 99;
int res = seek(arr, value, sta, end);
System.out.println("count = " + count);
System.out.println("res = " + res);
if(res>=0)
System.out.println("arr[res] = " + arr[res]);
}
private static int seek(int[] arr, int value, int sta, int end) {
// if (sta < 0 || end > arr.length - 1) {//这个写法是错误的,因为这个变量的变化并不会出现符合条件的数
// return -1;
// }
count++;
if (sta>end||value > arr[arr.length - 1] || value < arr[0]) {//其实判断条件和之前差不多。为了能够提前的结束不必要的判断。我们先把传入的值做了一个校验。
return -1;
}
int mid = sta+(end-sta)*((value-arr[sta])/(arr[end]-arr[sta]));
if ( value<arr[mid]) {
return seek(arr, value, sta, mid - 1);
} else if (value > arr[mid]) {
return seek(arr, value, mid+1, end);
}else {
return mid;
}
}
}
上一篇: 剑指offer算法-----数组遍历
下一篇: 入门oj 矩阵相似