编程语言
首页 > 编程语言> > 插值查找算法

插值查找算法

作者:互联网

差值查找算法与二分查找算法类似,主要就是mid的值不是(left=right)/2,而是mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low]);

image-20200716214044658

其中有两点不同:

1,int mid=low+ (right-left) * (findVal-arr[left]) / (arr[right] - arr[left])

2,由于mid公式里面自适应加入了findVal,所以我们前面要加判断findVal<arr[left]和findVal>arr[right]

代码实现如下:

 public static List<Integer> insertValueSearch(int[] arr,int left,int right,int findVal){
        if (left>right || findVal<arr[left] || findVal>arr[right]){
            return new ArrayList();
        }

        int mid=left+(right-left)*(findVal-arr[left])/(arr[right]-arr[left]);
        int midVal=arr[mid];
        if (findVal>midVal){
          return   insertValueSearch(arr,mid+1,right,findVal);
        }else if (findVal<midVal){
          return   insertValueSearch(arr,left,mid-1,findVal);
        }else{
            List<Integer> list=new ArrayList<Integer>();
            int temp=mid-1;
            while (true){
                if (temp<0||arr[temp]!=findVal){
                    break;
                }
                list.add(temp);
                temp--;
            }
            list.add(mid);
            temp=mid+1;
            while (true){
                if (temp>arr.length-1 ||arr[temp]!=findVal){
                    break;
                }
                list.add(temp);
                temp+=1;
            }
            return list;
        }
    }

注意:

标签:arr,right,插值,findVal,mid,int,算法,查找,left
来源: https://blog.csdn.net/qq_63037023/article/details/122790422