一、定义
插值查找法是对二分查找法的改进,改进的地方是中间下标的算法。插值查找法在数值分布均匀的情况下,比二分法查找的速度快,如果数值分布不均,速度就大打折扣了。
二、思想
1.二分查找法的中间值:(left+right)/2 转变成 left+1/2*(right-left)
2.插值查找的中间值:left+(key-arr[left])/(arr[right]-arr[left])*(right-left),key为查找值。
三、代码
public static int search3(int[] arr,int left,int right,int value) { System.out.println("插值,hello~"); //场景1。3个数,中间值为1,value大于中间值时,左边:mid+1=2,right=2,继续查找,此时中间值是2,mid+1=3,左边大于右边。 //场景2。3个数,中间值为1,value小于中间值时,左边:left=0,right=mid-1=0,继续查找,此时中间值是0,mid-1=-1,左边大于右边。 if (left > right //如果左边的值大于value,有序序列中无此值。 || arr[left] > value //如果右边的值小于value,有序序列中无此值。 || arr[right] < value) { return -1; } //int mid = (left + right)/2; int mid = left + (value-arr[left])/(arr[right]-arr[left])*(right-left); int midValue = arr[mid]; while(true) { if( value > midValue) { return search(arr, mid+1, right, value); }else if(value < midValue) { return search(arr, left, mid-1, value); }else { return mid; } } } |