一、思路分析
插值查找的基本思想和二分查找的基本思想类似。
二分查找中mid的取值为 mid = (left+right)/2 = left + (right - left)/2。
插值查找中mid的取值为mid=left+(item-arr[left])/(right-left)*(arr[right]-arr[left])。
注意:因为在上述mid的计算公式中(item-arr[left])有可能为负数,则在插值算法的条件中需要加上判断条件item >= arr[left] && item <= arr[right],该条件能够限制待查找的数据item存在于有序序列中。
二、代码
package com.Search;
public class InsertValueSearch {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
System.out.println(insertValueSearch(arr, 0, arr.length-1, 11));
}
public static boolean insertValueSearch(int[] arr, int left, int right, int item) {
// 因为在下面计算mid的公式中,(item - arr[left])有可能小于0,所以需要加上判断条件 item>=arr[left] && item<=arr[right]
if (left < right && item >= arr[left] && item <= arr[right]) {
int mid = left + (item - arr[left]) / (right - left) * (arr[right] - arr[left]);
if (item > arr[mid]) {
return insertValueSearch(arr, mid + 1, right, item);
} else if (item < arr[mid]) {
return insertValueSearch(arr, left, mid - 1, item);
} else {
return true;
}
} else {
return false;
}
}
}