参考二分查找
二分查找是特殊情况下的插值查找算法(我是这么理解的)
后面那一大串公式在二分查找里面就是1/2
public class InsertSelect {
/**
* 插值查找,查找的也必须是有序数列,基于二分查找
*/
/**
* 插值查找(Interpolation Search)是根据要查找关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式key-arr[low]/arr[high]-arr[low]。细看是不是key在整序列中的占比哟。所以mid的计算公式为:
* (high-low)*(key-arr[low])/(arr[high]-arr[low])。对比折半查找的mid = (high-low)/2。
* @param args
*/
public static void main(String[] args) {
int[] array=new int[] { 1,2,3,4,5,6};
int left =0;
int right=array.length-1;
//查找的值
int searchVal=1;
System.out.println(select(array,left,right,searchVal));
}
public static int select(int[] array,int left,int right,int searchVal){
/**
* 防止数组越界
*/
if (left>right || searchVal<array[0] || searchVal>array[array.length-1]){
return -1;
}
int mid=left+(right-left)*(searchVal-array[left])/(array[right]-array[left]);
int midValue=array[mid];
if(searchVal>midValue){
return select(array,mid+1,right,searchVal);
}
if(searchVal<midValue){
return select(array,left,mid-1,searchVal);
}else {
return mid;
}
}
}