1. 查找思路
- 循环:由mid点不断分割查找
- 当left > right 且 搜索值超出查找数组的范围时停止
- 当left == right 且 left值 == right值时,无法作mid被除数,停止
- 当找到时,返回此时的下标mid
- 分割值下标mid = left + (right - left) * [(searchValue - array[left]) / (array[right] - array[left])]
2. 代码实现
/**
* 插值查找(优化二分查找,loop实现,只返回第一个找到位置的下标)
* - 插值法循环查找array里是否有searchValue,有则返回第一个发现点的下标,没有则返回-1
* - mid = left + (right - left) * [(searchValue - array[left]) / (array[right] - array[left])]
* @param array - 要查找的数组
* @param searchValue - 要查找的数值
* @return - 找到返回第一个数值所在下标,没找到返回-1
*/
public static int insertValueSearchByLoop(int[] array, int searchValue) {
// 1. 设置左右端点下标
int left = 0;
int right = array.length - 1;
// 2. loop:由mid点不断分割查找
// 2.1 当left > right 且 搜索值超出查找数组的范围时停止
// 2.2 当left == right 且 left值 == right值时,无法作mid被除数,停止
// 2.3 当找到时,返回此时的下标mid
// * 每次 mid = left + (right - left) * ((searchValue - array[left]) / (array[right] - array[left]))
while (left <= right && searchValue >= array[left] && searchValue <= array[right]) {
// 防止mid被除数为0
int mid = 0;
if (left == right || array[left] == array[right]) {
if (searchValue == array[left]) {
return left;
}
break;
}
mid = left + (right - left) * ((searchValue - array[left]) / (array[right] - array[left]));
if (searchValue < array[mid]) {
right = mid - 1;
} else if (searchValue > array[mid]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}