插值查找算法

原来我们二分查找算法的时候是 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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值