package com.yu.search; import java.util.ArrayList; import java.util.List; /** * 插值查找算法 * @author Administrator * */ public class InsertValueSearchDemo { public static void main(String[] args) { int[] arr = {1,8,10,24,24,24,56,99}; List<Integer> list = insertValueSearch(arr,0,arr.length-1,24); System.out.println(list); } /** * 插值查找算法 * @param arr 查找的数组 * @param left 数组的第一个下标 * @param right 数组的最后一个下标 * @param value 要查找的值 * @return */ private static List<Integer> insertValueSearch(int[] arr, int left, int right, int value) { //判断递归退出的条件 左下标大于右下标,数组的第一个值大于要查找的值,最后一个值小于要查找的值 if(left > right || arr[left] > value || arr[right] < value) { return null; } //插值查找查找下标的算法 int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]); int midVal = arr[mid]; if(midVal > value) { //value 4 midVal 5 //midValue大于要查找的值,则向右边进行查找 return insertValueSearch(arr,left,mid-1,value); }else if(midVal < value){ //反之向左边进行查询 return insertValueSearch(arr,mid+1,right,value); }else { //剩下的就是查找到的值,把查找到的值得下标加入到数组 List<Integer> list = new ArrayList<>(); list.add(mid); //查找midVal左右两边是否有相同的值 int temp = mid-1; while(true) { //如果temp的下标小于0或者mid左边的值不等于要查找的值则退出循环 if(temp < 0 || arr[temp] != value) { break; } list.add(temp); temp--; } temp = mid + 1; while(true) { //如果temp的下标大于right或者mid右边的值不等于要查找的值则退出循环 if(temp > right || arr[temp] != value) { break; } list.add(temp); temp++; } return list; } } } |