插入查找
插值查找原理介绍 :
插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。
将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.
key 就是前面我们讲的 要查找的值
二分查找中的经过变换
也就是说我们的mid
每次都是折中的取,但是对于一些均匀分布的有序表,这样做感觉有些费时,比如找字典的时候,找a这个字母,我们肯定不会从中间开始,而是偏向于字典前面一些开始。
总之相当于
int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])
public static ArrayList<?> insertionSearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
ArrayList<Integer> integers = new ArrayList<>();
while (left < right) {
int mid =left+ (right -left) *(target-arr[left])/(arr[right]-arr[left]);
if (arr[mid] < target) {
left=mid;
}else if (arr[mid]>target){
right=mid;
}else {
int i=mid-1;
int j=mid+1;
while (arr[i]==target){
integers.add(i--);
}
integers.add(mid);
while (arr[j]==target){
integers.add(j++);
}
return integers;
}
}
return integers;
}