package com.guigu.search;
import java.util.Arrays;
/**
* @author: guorui fu
* @versiion: 1.0
* 插值查找 适用于数组arr有序,关键字分布均匀的表 分布不均匀的表之间跳跃性大
*/
public class InsertValueSearch {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i + 1;
}
// System.out.println(Arrays.toString(arr));
int index = insertValueSearch(arr, 0, arr.length - 1, 100);
System.out.println("下标为=" + index);
}
/**
*
* @param arr 数组
* @param left 左索引
* @param right 右索引
* @param findVal 查找的值
* @return 返回对应下标
*/
public static int insertValueSearch(int[] arr,int left,int right,int findVal){
//公式就是等比例缩放(mid - low)/ (high - low) = (key - a[low] / (a[high] -a[low]) ))
//findVal < arr[0] ||findVal > arr[arr.length - 1] 可以帮助处理越界情况
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 insertValueSearch(arr, mid + 1, right, findVal);
}else if (findVal < midVal){//向左递归
return insertValueSearch(arr, left, mid - 1, findVal);
}else {
return mid;
}
}
}
[算法] 插值查找
最新推荐文章于 2024-09-27 14:28:55 发布