【问题标题】:Binary search does not work with doubles二进制搜索不适用于双打
【发布时间】:2013-12-19 18:35:00
【问题描述】:

这个程序可以很好地处理整数,但不能处理双精度数。没有错误,但程序返回 -1。对不起,如果这是一个愚蠢的问题,但我是编程新手。

public class binarySearchProject
{
  public static int binarySearch(double[] arr, double x, int high, int low)
  {
    int mid=(high+low)/2;
    if(high==low || low==mid || high==mid)
    {
      return -1;
    }
    if(arr[mid]>x)
    {
      return binarySearch(arr, x, high, mid);
    }
    else if(arr[mid]<x)
    {
      return binarySearch(arr, x, mid, low);
    }
    else if(arr[mid]==x)
    {
      return mid;
    }
    return -1;
  }
  public static void main(String args[])
  {
    double i = 45.3;
    double[] a = {-3, 10, 5, 24, 45.3, 10.5};
    int size = a.length;
    System.out.println(binarySearch(a, i, size, 0));
  }
}

【问题讨论】:

  • 它也不适用于ints。我试过了。
  • 不知道是不是这个问题,但是不应该对数组进行排序以使二进制搜索起作用吗?
  • 我认为你也交换了你的案例:如果 mid > x 那么你应该在下半部分搜索,而不是在上半部分。
  • 是为了锻炼目的吗?如果不是,请不要重新发明轮子并使用Arrays.binarySearch(double[] a, double key)

标签: java search binary


【解决方案1】:

你应该改变条件:

if (arr[mid] &gt; x) 应该是if (arr[mid] &lt; x)

else if (arr[mid] &lt; x) 应该是else if (arr[mid] &gt; x)

还要注意,为了使这个工作,数组必须排序(这就是二分查找的重点),你可以使用Arrays#sort

Arrays.sort(a);

我建议您重命名您的类,使其以大写字母开头(遵循 Java 命名约定)。

【讨论】:

  • 谢谢。没有发现任何问题。后者更大。
  • 是的,首先排序,然后调用您的二进制搜索。也许还有更多的测试数组来测试你的功能。听到“但是先生,它可以在我的桌面上使用我的数据!”后的一般软件建议!
【解决方案2】:

正如@tobias_k 指出的那样:

要使二分搜索起作用,您需要先对数组进行排序。 详情请见Wikipedia

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2014-09-19
    • 2014-05-29
    • 2017-09-23
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多