插值查找类似于二分查找法,所以代码类似,但是唯一的不同是mid的计算方式,由于插值查找具有自适性,所以此处的mid=low+(high-low)*(traget-arr[low])/(arr[high]-arr[low])。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.*;
public class insertsearch {
public static ArrayList<Integer> insertsearch(int[] arr,int left,int right,int findval)
{
if(left>right||findval<arr[0]||findval>arr[arr.length-1])
{
return new ArrayList<Integer>();
}
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
{
ArrayList<Integer> resindexlist=new ArrayList<Integer>();
resindexlist.add(mid);
int temp=mid+1;
while(true)
{
if(temp>arr.length-1||arr[temp]!=findval)
{
break;
}
else
{
resindexlist.add(temp);
temp++;
}
}
return resindexlist;
}
}
public static void main(String[] args) {
int[] arr= {1,1,1,3,4,5};
List<Integer> reslist=insertsearch(arr,0,arr.length-1,1);
System.out.println(reslist);
}
}