欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

插值查找算法

程序员文章站 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;
        }
    }
}

相关标签: 查找算法