插值查找

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

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

所谓均匀分布,是指序列中各个相邻元素的差值近似相等。例如,{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 @ 2022-02-23 15:19  被动  阅读(314)  评论(0)    收藏  举报