一点一点

插入查找

插入查找

插值查找原理介绍 :

插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。

将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.
key 就是前面我们讲的 要查找的值

二分查找中的经过变换1595218348224

也就是说我们的mid每次都是折中的取,但是对于一些均匀分布的有序表,这样做感觉有些费时,比如找字典的时候,找a这个字母,我们肯定不会从中间开始,而是偏向于字典前面一些开始。

总之相当于

int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

  public static ArrayList<?> insertionSearch(int[] arr, int target) {

        int left = 0;
        int right = arr.length - 1;
        ArrayList<Integer> integers = new ArrayList<>();

        while (left < right) {
            int mid =left+ (right -left) *(target-arr[left])/(arr[right]-arr[left]);
            if (arr[mid] < target) {
                left=mid;
            }else if (arr[mid]>target){
                right=mid;

            }else {

                int i=mid-1;
                int j=mid+1;
                while (arr[i]==target){
                    integers.add(i--);
                }
                integers.add(mid);
                while (arr[j]==target){
                    integers.add(j++);
                }

                return integers;
            }
        }
        return integers;
    }

posted @ 2020-07-20 16:02  6风筝9  阅读(256)  评论(0编辑  收藏  举报