插值查找类似于二分查找,只是把mid改为自适应的:mid = left + (right - left) * (val - arr[low]) * (arr[high] - arr[low]);
插值查找注意事项:
1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.
2)关键字分布不均匀的情况下,该方法不一定比折半查找要好
public int search(int[] arr, int val){
int left = 0;
int right = arr.length - 1;
int mid = -1;
while (left <= right){
mid = left + (right - left) * (val - arr[left]) / (arr[right] - arr[left]);
if (arr[mid] < val){
left = mid + 1;
}else if (arr[mid] > val){
right = mid - 1;
}else{
return mid;
}
}
return -1;
}