插值查找算法,是二分查找的优化版本,适用于均匀分布样本,同样要求数组有序,可以减少递归次数,其核心思想是根据目标值和中间元素的差值来决定在数组的哪一半中继续查找。
package com.example.datastructures.search;
import java.util.Arrays;
/**
* @author maoyouhua
* @version jdk21
*
* 插值查找算法,是二分查找的优化版本,适用于均匀分布样本,同样要求数组有序,可以减少递归次数
* 其核心思想是根据目标值和中间元素的差值来决定在数组的哪一半中继续查找。
*
* 二分查找 int mid = (left + right) / 2; -> left + 1/2(right - left)
*/
public class InsertValueSearch {
public static int insertValueSearch(int[] arr, int findValue, int left, int right){
if (left > right || findValue < arr[0] || findValue > arr[arr.length -1]) {
return -1;
}
int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
if (findValue < arr[mid]) {
return insertValueSearch(arr,findValue,left,mid - 1);
} else if (findValue > arr[mid]) {
return insertValueSearch(arr,findValue,mid + 1,right);
}else {
return mid;
}
}
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i;
}
int index = insertValueSearch(arr, 99, 0, arr.length - 1);
System.out.println("index:" + index);
}
}