查找算法-插值查找算法

插值查找算法

  1. 插值查找原理介绍:

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

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

 

 

  1. int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/*插值索引*/

对应前面的代码公式:

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

  1. 举例说明插值查找算法 1-100 的数组

插值查找应用案例:

请对一个有序数组进行插值查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

代码实现:

代码实现

package com.xuge.search;

import java.util.Arrays;

/**
 * author: yjx
 * Date :2022/5/3114:05
 **/
public class InertValSearch {
  public static void main(String[] args) {
  int []arr=new int [100];
    for (int i = 0; i < arr.length; i++) {
      arr[i]=i+1;
    }
    System.out.println(Arrays.toString(arr));


    System.out.println("=======================");
    System.out.println(insertValSearch(arr, 0, arr.length - 1, 1));
  }
  //编写插值查找算法 要求数组有序
  public static int insertValSearch(int []arr,int left,int right,int findVal){
    System.out.println("hahha");
    //没有找到  必须需要,
    if(left>right||findVal<arr[0]||findVal>arr[arr.length-1]){
      return -1;
    }
    //mid索引
    int mid=left+(right-left)*(findVal-arr[left])/(arr[right]-arr[left]);
    int midVal=arr[mid];
    if(findVal>midVal){//向右递归
      return insertValSearch(arr,mid+1,right,findVal);
    }else if(findVal<midVal){
      return insertValSearch(arr,left,mid-1,findVal);
    }else{
      return mid;
    }



  }

}

  

 

 

posted @ 2022-05-31 14:16  xugeA  阅读(67)  评论(0)    收藏  举报