Java 基于排序列表的二进制搜索算法

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);

假设我的算法告诉我'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;
}
}
导入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。谢谢大家!!