Java 自定义二进制搜索函数工作不正常
我正在创建一个自定义的二进制搜索函数,遇到了一些问题。我已经查看了代码很长一段时间了,但是,我不明白为什么什么都没有返回。请让我知道你的想法。谢谢大家! a是数组,b是最后返回的结果,t是目标值。Pos是当前位置,min和max是最小和最大位置Java 自定义二进制搜索函数工作不正常,java,loops,binary-search,Java,Loops,Binary Search,我正在创建一个自定义的二进制搜索函数,遇到了一些问题。我已经查看了代码很长一段时间了,但是,我不明白为什么什么都没有返回。请让我知道你的想法。谢谢大家! a是数组,b是最后返回的结果,t是目标值。Pos是当前位置,min和max是最小和最大位置 public static int binarySearch(int a[], int t){ int min = 0; int max = a.length; if (a[0] == t){ return 0;
public static int binarySearch(int a[], int t){
int min = 0;
int max = a.length;
if (a[0] == t){
return 0;
}
int b = -1;
for (int pos = min; a[pos] != t;){
pos = (max - min) / 2;
if (a[pos] == t){
b = pos;
} else {
if(t > a[pos]){
min = pos + 1;
} else {
min = pos - 1;
}
}
}
return b;
}
两个小问题
pos = (max - min) / 2;
看起来您试图找到这些值的平均值,但却发现了一半的差异
要找到平均值,使用pos=(max-min)/2+min代码>
此外,当向下移动max
时,您会意外地将min
向上移动
min=pos-1代码>应改为max=pos-1代码>两个小问题
pos = (max - min) / 2;
看起来您试图找到这些值的平均值,但却发现了一半的差异
要找到平均值,使用pos=(max-min)/2+min代码>
此外,当向下移动max
时,您会意外地将min
向上移动
min=pos-1代码>应改为max=pos-1代码>我发现您的代码有三个问题:
您的循环条件不足以决定整个过程的终止。您的循环条件是a[pos]!=t
并且您只会增加或减少pos
,如果在数组中找不到我们搜索的元素,则最终会导致arrayindexoutofbounds异常
您的if-else不正确,因为您只更新最小值,而不更新最大值
不是每次将值pos
移动一半,而是将其设置为最小值和最大值的平均值,这是不正确的
综合以上所有因素,您将得到以下结果:
public static int binarySearch(int a[], int t) {
int min = 0;
int max = a.length;
if (a[0] == t) {
return 0;
}
int b = -1;
for (int pos = min; a[pos] != t;) {
pos = min + (max - min) / 2;
if (pos >= a.length || pos <= 0) {
break;
}
if (a[pos] == t) {
b = pos;
} else {
if (t > a[pos]) {
min = pos + 1;
} else {
max = pos - 1;
}
}
}
return b;
}
publicstaticintbinarysearch(inta[],intt){
int min=0;
int max=a.长度;
if(a[0]==t){
返回0;
}
int b=-1;
对于(int pos=min;a[pos]!=t;){
pos=min+(max-min)/2;
如果(位置>=a.length | |位置a[pos]){
最小=位置+1;
}否则{
最大值=位置-1;
}
}
}
返回b;
}
我发现您的代码有三个问题:
您的循环条件不足以决定整个过程的终止。您的循环条件是a[pos]!=t
并且您只会增加或减少pos
,如果在数组中找不到我们搜索的元素,则最终会导致arrayindexoutofbounds异常
您的if-else不正确,因为您只更新最小值,而不更新最大值
不是每次将值pos
移动一半,而是将其设置为最小值和最大值的平均值,这是不正确的
综合以上所有因素,您将得到以下结果:
public static int binarySearch(int a[], int t) {
int min = 0;
int max = a.length;
if (a[0] == t) {
return 0;
}
int b = -1;
for (int pos = min; a[pos] != t;) {
pos = min + (max - min) / 2;
if (pos >= a.length || pos <= 0) {
break;
}
if (a[pos] == t) {
b = pos;
} else {
if (t > a[pos]) {
min = pos + 1;
} else {
max = pos - 1;
}
}
}
return b;
}
publicstaticintbinarysearch(inta[],intt){
int min=0;
int max=a.长度;
if(a[0]==t){
返回0;
}
int b=-1;
对于(int pos=min;a[pos]!=t;){
pos=min+(max-min)/2;
如果(位置>=a.length | |位置a[pos]){
最小=位置+1;
}否则{
最大值=位置-1;
}
}
}
返回b;
}
您尝试了哪些调试?你试过打印循环中的值吗?t
,a
,b
都是毫无意义的:它们让你的代码难以阅读:你试过什么调试?你试过打印循环中的值吗?t
,a
,b
都是毫无意义的:它们使你的代码难以阅读: