二分查找+插值查找

package A;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;

public class JosePhu {
public static void main(String[] args) {
Method method = new Method();
int[] a={5};
ArrayList<Integer> b=method.binarySort(a,0,a.length-1,5);
System.out.println(b);
}

}

package A;

import java.util.ArrayList;
import java.util.Arrays;

public class Method {
//a必须是有序数组
public ArrayList<Integer> binarySort(int[] a,int left,int right,int findVal){
if (left>right){//当只一个元素时,left=right=mid,然后right=mid-1<left,自行理解就行
return new ArrayList<>();
}
int mid=(left+right)/2;
/*
//插值查找
System.out.println("hello");
if (left>right||findVal<a[left]||findVal>a[right]){//mid不再是中值,a[mid]会越界
return new ArrayList<>();
}
//有了此公式,只需查一次即可,简称自适应查找
int mid=left+(right-left)*(findVal-a[left])/(a[right]-a[left]);
*/
int midVal=a[mid];
if (findVal<midVal){
return binarySort(a,left,mid-1,findVal);
}else if (findVal>midVal){
return binarySort(a,mid+1,right,findVal);
}else {
ArrayList<Integer> list=new ArrayList<>();
list.add(mid);
int temp=mid-1;//以下是判断有无重复的数,
while (true){
if (temp<0||a[temp]!=findVal){
break;//temp<0说明找到了最左边
}
list.add(temp);
temp--;//
}

temp=mid+1;//向右找
while (true){
if (temp>a.length-1||a[temp]!=findVal){
break;//
}
list.add(temp);
temp++;//
}

return list;
}
}
}

posted @ 2021-08-04 09:41  朱在春  阅读(42)  评论(0编辑  收藏  举报