查找算法之插入查找

 

插值查找的原理介绍

1.插值查找算法类似与二分查找,不同的是插值查找每次从自适应mid处开始查找。

2.折半查找中的求mid索引的公式,low表示最左边索引,high表示右边索引

mid=(low+high)/2=low+(high-low)/2------->mid=low+(key-a[low])(high-low)/(a[high]-a[low])

3.mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low])//插值索引

插值查找注意事项

1.对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找速度比较快

2.关键字不均匀的情况下,查找速度不一定比二分查找好

代码:

package com.gcy.searcch;
/**
* 插值查找算法:
* 数组必须有序
* @author Administrator
*
*/
public class InsertValueSearch {

public static void main(String[] args) {
int [] arr=new int[100];
for(int i=1;i<100;i++) {
arr[i]=i+1;
}
int s=insertValueSearch(arr, 0, arr.length-1, 100);
System.out.println("s="+s);

}
/**
* 插值查找
* @param arr
* @param left
* @param right
* @param val
* @return
*/
public static int insertValueSearch(int [] arr,int left,int right,int val) {
if(left>right || val<arr[0] || val>arr[arr.length-1]) {
return -1;
}
int mid=left+(right-left)*(val-arr[left])/(arr[right]-arr[left]);
int midVal=arr[mid];
if(val>midVal) {//向右边进行查找
return insertValueSearch(arr, mid+1, right, midVal);
}else if(val<midVal) {//向左边进行查找
return insertValueSearch(arr, left, mid-1, midVal);
}else {
return mid;
}

}

}

结果:

 

 

 

posted @ 2020-10-07 21:32  IT特工  阅读(364)  评论(0编辑  收藏  举报