来自排序列表的二进制搜索算法

时间:2012-12-27 11:56:48

标签: 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);
    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;
}
}

4 个答案:

答案 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)

  1. 在java和大多数语言中,索引从0开始,而不是1,结束于n-1,而不是n
  2. 对于二进制搜索,请仔细检查何时退出while循环,并始终记住低变量和高变量的含义,无论是[低,高]还是[低,高]
  3. 对于这个特定的问题,你还应该考虑如果数组中有重复项是什么。是否返回第一个元素或数组中的任何人