插值查找
插值查找事实上是一种二分查找的一种改进。数组中元素不能有重复。
(1)解决二分查找的不足
当数组中的数据分布极度不均与时,如{0,1,2,2000,2001,…,99998}.如果用二分查找,那么查找的次数会很多。而插值查找就适合这种极端不均匀的数据。
(2)插值查找与二分查找的不同
-
插值查找的mid公式
-
二分查找的mid公式
即两种算法的区别只有在计算mid时的系数不同
插值查找 | 二分查找 |
---|---|
mid的系数为(num - arr[start])/(arr[end] - arr[start]) | mid的系数为1/2 |
(3)代码实现
注: 数组中元素不能有重复。
public static int binarySearch(int[] arr,int num){
int start = 0;
int end = arr.length - 1;
while(start <= end){
int mid = start+(end-start)*(num - arr[start])/(arr[end] - arr[start]);
if(num == arr[mid]){
return mid;
}else if(num < arr[mid]){
end = mid - 1;
}else if(num > arr[mid]){
start = mid + 1;
}
}
return -1;
}