Java 基于排序列表的二进制搜索算法
假设我的算法告诉我'x'(值为5)是否在排序数组中。然而,我一直得到0分。因为我的条件是,如果“x”不在数组中,则显示0。我哪里做错了Java 基于排序列表的二进制搜索算法,java,algorithm,sorting,binary-search,Java,Algorithm,Sorting,Binary Search,假设我的算法告诉我'x'(值为5)是否在排序数组中。然而,我一直得到0分。因为我的条件是,如果“x”不在数组中,则显示0。我哪里做错了 import java.util.Arrays; public class binarySeacg { public static void main (String[]args) { int[] array = {10,7,11,5,13,8}; exchangesort(array); binsearch(array,5);
import java.util.Arrays;
public class binarySeacg {
public static void main (String[]args)
{
int[] array = {10,7,11,5,13,8};
exchangesort(array);
binsearch(array,5);
System.out.println(Arrays.toString(array));
}
public static void exchangesort(int[] S)
{
int i,j,temp;
for(i=0;i<S.length;i++)
for(j=i+1;j<S.length;j++)
if(S[i]>S[j])
{
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
}
public static int binsearch(int[] S, int x)
{
int location, low, high, mid;
low = 1; high = S.length;
location = 0;
while(low<=high && location==0)
{
mid =(low + high)/2;
if(x== S[mid])
location = mid;
else if(x < S[mid])
high = mid -1;
else
low = mid + 1;
}
System.out.println(location);
return location;
}
}
导入java.util.array;
公共类二进制代码{
公共静态void main(字符串[]args)
{
int[]数组={10,7,11,5,13,8};
交换端口(阵列);
b搜索(数组,5);
System.out.println(array.toString(array));
}
公共静态无效交换端口(int[]S)
{
int i,j,温度;
对于(i=0;i您设置了low=1;
,5是最小元素-因此它在索引0中-因此在[1,S.length]的子列表中-它确实不在那里
您应该设置low=0;
,并从第一个元素开始,而不是第二个元素(记住java中的索引从0开始,而不是从1开始)
(PS,请注意,在这种特定情况下,算法是正确的,因为在排序列表中-5位于索引0中)。因为,您正在尝试查找传递给3
的x
值,但该值不存在。因此,请将其更改为其他值,如5
,然后重试
此外,您应该启动low=0
,而不是low=1
。因为它将始终错过第一个元素
public static int binsearch(int[] S, int x)
{
int location, low, high, mid;
low = 0; high = S.length;
location = 0;
while(low<=high && location==0)
{
mid =(low + high)/2;
if(x == S[mid])
{
location = mid;break;
}
else if (x < S[mid])
{
high = mid - 1;
} else
{
low = mid + 1;
}
}
System.out.println(location);
return location;
}
publicstaticintbinsearch(int[]S,intx)
{
内部位置,低、高、中;
低=0;高=S.长度;
位置=0;
而(low这里是对数组进行排序,然后使用排序后的数组搜索元素
如果搜索成功,则执行以下任务
location=mid;这意味着您正在将匹配元素的索引分配给location变量
在本例中,元素5位于第0个索引中
因此,您的STDOUT总是得到0
在java和大多数语言中,索引从0开始,而不是1,并在n-1结束,而不是n
对于二进制搜索,请在退出while循环时仔细检查,并始终记住低变量和高变量的含义,无论是[low,high]还是[low,high]
对于这个特定的问题,U还应该考虑数组中是否存在重复。是否返回数组中的第一个元素或任何人?
顺便说一句,它应该是mid=(低+高)>>>1;
@user1883386您发现错误了吗?我已经相应地修复了,但是我的IDE没有给我结果。它也没有停止,只是继续运行。检查我的更新,并将您的二进制代码搜索代码更改为该代码。别忘了接受有用的答案。;)你有点晚了,OP已经更改了他/她的代码。虽然,对于当前的代码,这是原因。Juz现在我有时间研究这个问题谢谢大家!!你们所有的输入都是++!!是的,5在第0个索引中!我想我必须更改索引,使它从1开始到n。谢谢大家!!