插值查找算法的代码实现易错点
int next = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
//按照值和索引的比例关系推算下一个查找位置,但是存在两个风险
//(1)数组越界访问风险:如果findVal远大于arr[right],next会大于right
//解决方法:对findVal是否在序列内的进行初步判断
//(2)除数为0的风险:如果a[right]==arr[left],除数为0;这在有相同数值的序列可能出现此类情况
//解决方法:判断序列两端值是否相等,若相等,则判断是否为目标值
public static int insertionFind(int[] arr, int findVal){
if(arr[0] > findVal || arr[arr.length - 1] < findVal){
return -1;
}
int left = 0;
int right = arr.length - 1;
while (left <= right){
if(arr[left] == arr[right]){
return arr[left]==findVal ? left : -1;
}
int next = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
if(arr[next] == findVal){
return next;
}else if(arr[next] < findVal){
left = next + 1;
}else{
right = next - 1;
}
}
return -1;
}
}