描述:
插值排序算法是在二分法搜索算法程度上的优化,二分法大家都想必了解了,就是不断取中间的值mid ,判断VAL所在区间,随后吧之前mid作为前后阈值进而吧搜索范围缩小为原来的1/2.
处理:
这里的关键点就在如何快速定位中间值就是你需要找的值,那么引出一种优化的算法,插值排序,这种排序算法优化的点就在一开始吧需要找的VAL作为参数用某公式平衡,从而减少重复次数,前提是有序集合。
代码:
package org.palm.hazelcast.laohanexcise;
import java.util.Arrays;
/**
* @date 19-9-27
* @auther jackliang
* @description TODO
*/
public class InsertValueSearchAlorigthm {
public static void main(String[] args) {
int [] arrs = new int[100];
for (int i = 0 ; i < 100 ;i++){
arrs[i]=i+1;
}
System.out.println(Arrays.toString(arrs));
int index = insertValueSearch(arrs,0,arrs.length-1,78);
System.out.println("index="+index);
}
/**
* 插值查找算法
*
* @param arr
* @param left
* @param right
* @param findVal
* @return
*/
public static int insertValueSearch (int[] arr,int left ,int right,int findVal) {
System.out.println("count");
if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
return -1;
}
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;
}
}
}
平衡公式就在于这句话
int mid = left + (right -left) * (findVal -arr[left]) / (arr[right] - arr[left]);
原来我们二分发的处理公式为(left + right) >>> 1