1. package com.atguigu.search;
  2. /**
  3. * ClassName: <br/>
  4. * Description: <br/>
  5. * Date: 2021-02-24 9:15 <br/>
  6. * @project data_algorithm
  7. * @package com.atguigu.search
  8. */
  9. import java.util.Arrays;
  10. public class InsertValueSearch {
  11. public static void main(String[] args) {
  12. // int [] arr = new int[100];
  13. // for(int i = 0; i < 100; i++) {
  14. // arr[i] = i + 1;
  15. // }
  16. int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };
  17. int index = insertValueSearch(arr, 0, arr.length - 1, 1234);
  18. //int index = binarySearch(arr, 0, arr.length, 1);
  19. System.out.println("index = " + index);
  20. //System.out.println(Arrays.toString(arr));
  21. }
  22. public static int binarySearch(int[] arr, int left, int right, int findVal) {
  23. System.out.println("二分查找被调用~");
  24. // 当 left > right 时,说明递归整个数组,但是没有找到
  25. if (left > right) {
  26. return -1;
  27. }
  28. int mid = (left + right) / 2;
  29. int midVal = arr[mid];
  30. if (findVal > midVal) { // 向 右递归
  31. return binarySearch(arr, mid + 1, right, findVal);
  32. } else if (findVal < midVal) { // 向左递归
  33. return binarySearch(arr, left, mid - 1, findVal);
  34. } else {
  35. return mid;
  36. }
  37. }
  38. //编写插值查找算法
  39. //说明:插值查找算法,也要求数组是有序的
  40. /**
  41. *
  42. * @param arr 数组
  43. * @param left 左边索引
  44. * @param right 右边索引
  45. * @param findVal 查找值
  46. * @return 如果找到,就返回对应的下标,如果没有找到,返回-1
  47. */
  48. public static int insertValueSearch(int[] arr, int left, int right, int findVal) {
  49. System.out.println("插值查找次数~~");
  50. //注意:findVal < arr[0] 和 findVal > arr[arr.length - 1] 必须需要
  51. //否则我们得到的 mid 可能越界
  52. if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
  53. return -1;
  54. }
  55. // 求出mid, 自适应
  56. int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
  57. int midVal = arr[mid];
  58. if (findVal > midVal) {
  59. // 说明应该向右边递归
  60. return insertValueSearch(arr, mid + 1, right, findVal);
  61. } else if (findVal < midVal) {
  62. // 说明向左递归查找
  63. return insertValueSearch(arr, left, mid - 1, findVal);
  64. } else {
  65. return mid;
  66. }
  67. }
  68. }

差值查找注意事项

  • 对于数据量较大,关键字分布比较均匀的查找表来书,采用差值查找,速度较快,
  • 关键字分布不均匀的情况下,该方法不一定比折半查找要好