1. package com.atguigu.search;
    2. /**
    3. * 插值查找
    4. *
    5. * @author Dxkstart
    6. * @create 2021-10-15-18:15
    7. */
    8. public class InsertValueSearch {
    9. public static void main(String[] args) {
    10. int[] arr = new int[100];
    11. for (int i = 0; i < 100; i++) {
    12. arr[i] = i + 1;
    13. }
    14. //测试
    15. int index = insertValueSearch(arr, 0, arr.length - 1, 61);
    16. System.out.println(index);
    17. }
    18. //编写插值查找算法
    19. //说明:插值查找算法,也要求数组是有序的
    20. /**
    21. * @param arr 数组
    22. * @param left 左边索引
    23. * @param right 右边索引
    24. * @param findVal 查找的值
    25. * @return 如果找到,就返回对应的下标,如果没有找到,就返回-1
    26. */
    27. public static int insertValueSearch(int[] arr, int left, int right, int findVal) {
    28. //注意:findVal < arr[0] 和 findVal > arr[arr.length - 1] 必须需要
    29. //否则我们得到的mid可能会越界
    30. if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
    31. return -1;
    32. }
    33. //求出mid
    34. int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
    35. int midVal = arr[mid];
    36. if(findVal > midVal){//说明应该向右递归
    37. return insertValueSearch(arr,mid + 1,right,findVal);
    38. }else if (findVal < midVal){
    39. return insertValueSearch(arr,left,mid - 1,findVal);
    40. }else {
    41. return mid;
    42. }
    43. }
    44. }