插值查找 java


/*
*插入值查找思路:
* 与二分查找类似
* 不同的是:插入值查找每次从自适应mid处开始查找
* mid = left +(right - left) * (findVal - arr[left])/ (arr[right] -arr[left])
* mid是插入中间值,left是左索引,right是右索引,findVal是查找值,arr[..]索引所在的值
* 好处,数据量大,关键字分布比较均匀的时候使用,插入速度比二分快
* */
import java.util.Arrays;
public class InsertSearch {
public static void main(String[] args) {
// int [] arr = new int[100];
// for (int i = 0; i <100 ; i++) {
// arr[i] = i+1;
//
// }
//生成100有序列
int arr[] ={1,8,60,101,205,400};

//System.out.println(Arrays.toString(arr));测试数列
int index = insertSearch(arr,0,arr.length-1,-1);

if (index == -1){
System.out.println("没有该值");
}else{
System.out.println(index);
}

}

/**
*
* @param arr 数列
* @param left 左索引
* @param right 右索引
* @param findVal 查找值
*/
public static int insertSearch(int []arr,int left,int right,int findVal){
//注意,不然mid可能会越界
if(left>right || findVal<arr[0] ||findVal>arr[arr.length-1]){
return -1;
}

int mid = left +(right - left) * (findVal - arr[left])/ (arr[right] -arr[left]);
int midVal =arr[mid];
if(findVal > midVal){//向右递归
return insertSearch(arr, mid+1, right, findVal);

}else if(findVal < midVal){//向左递归
return insertSearch(arr, left, mid-1, findVal);
}else {
return mid;
}
}
}
-----梁氏
posted @ 2020-10-06 21:51  Liang-shi  阅读(271)  评论(0编辑  收藏  举报