package com.datastructure.searchalgorithm;
import java.util.ArrayList;
import java.util.List;
/**
* 插值查找算法
*
* 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快
*
* 但是在关键字分布不均匀的情况下,该方法不一定比二分查找要好
*/
public class InsertValue {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,5,5,6,7,8,9};
List<Integer> position = insertValue(arr,0,arr.length-1,1);
System.out.println(position);
}
/**
* 插值查找算法
*/
public static List<Integer> insertValue(int[] arr, int left, int right, int val){
if (left>right||val>arr[arr.length-1]||val<arr[0]){
return new ArrayList<Integer>();
}
int mid = left + (right - left) * (val - arr[left]) / (arr[right] - arr[left]);
int midVal = arr[mid];
if (val<midVal){
return insertValue(arr,left,mid,val);
}else if (val>midVal){
return insertValue(arr,mid+1,right,val);
}else {
List<Integer> list = new ArrayList<>();
int temp = mid-1;
list.add(mid);
while (true){
if (temp<0||arr[temp]!=val){
break;
}
list.add(temp);
temp--;
}
temp = mid+1;
while (true){
if (temp>right||arr[temp]!=val){
break;
}
list.add(temp);
temp++;
}
return list;
}
}
}
03-28