二分查找+插值查找

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 @   朱在春  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示