插值查找
插值查找和二分查找类似,只是改变了mid的取值方式
适用范围:单调数组(和二分查找一样)
非递归
public static int insertValueSearch(int[] A,int left,int right,int key){
if (left > right || key < A[0] || key > A[A.length - 1]){
return -1;
}
//改变过后求中间下标的算法
int mid = left +(right - left) * (key - A[left]) / (A[right] - A[left]);
if (key > A[mid]){//右递归
return insertValueSearch(A,mid + 1,right,key);
}else if (key > A[mid]){//左递归
return insertValueSearch(A,left,mid - 1,key);
}else {//找到了
return mid;
}
}
递归
public static int insertValueSearch_one(int[] A,int key){
int left = 0;
int right = A.length-1;
while(left <= right) {
int mid = left +(right - left) * (key - A[left]) / (A[right] - A[left]);
if(A[mid] < key) {
left = mid + 1;
}else if(A[mid] > key) {
right = mid -1;
}else {
return mid;
}
}
return -1;
}
主函数及结果