我的算法假设告诉我'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);
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;
}
}
答案 0 :(得分:2)
你设置low = 1;
,而5是最小元素 - 所以它在索引0中 - 所以在[1,S.length]的子列表中 - 确实不存在。
你应该设置low = 0;
,并从第一个元素开始 - 而不是第二个元素。 (请记住,java中的索引从0开始,而不是1)。
(PS,请注意,在这种特定情况下 - 算法是正确的,因为在排序列表中 - 5在索引0中)。
答案 1 :(得分:1)
因为,您正在尝试查找x
值,并在列表中找到3
。它不存在。因此,将其更改为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;
}
注意:对于不同的输出,请在此处更改值binsearch(array,5);
,这是从main()
方法调用的。请记住,更改列表中的值。
答案 2 :(得分:1)
在这里,您要对数组进行排序,然后使用已排序的数组来搜索元素。
如果搜索成功,则执行以下分配
location = mid;这意味着您要将匹配元素的索引分配给位置变量。
在这种情况下,元素5在第0个索引中。
因此,你的STDOUT总是得到0
答案 3 :(得分:0)