Arrays.binarysearch(double [] array,key)返回-1

时间:2016-06-02 08:41:16

标签: java arrays binary-search

我编写了一小段代码来确定数组中下一个较小元素的索引。代码片段如下:

public static int FindNextSmallest(double[] arr1, int current_small_index) {
    double current_smallest_element = arr1[current_small_index];       

    double[] new_arr1 = arr1.clone();

    Arrays.sort(new_arr1);

    int v = Arrays.binarySearch(new_arr1, current_smallest_element);

    double next_small = new_arr1[v + 1];
    int next_small_index = Arrays.binarySearch(arr1, next_small);
    return next_small_index;
}

该数组包含以下值:{0.6666,0.6666,0.6666,-0.9333,-0.9333}。

一开始,current_small_index是3,current_small_element = -0.9333,接下来它返回下一个最小的元素,在这种情况下,在索引位置4是-0.9333。但是它返回-1。

请帮忙。

2 个答案:

答案 0 :(得分:5)

在本声明中

int next_small_index = Arrays.binarySearch(arr1, next_small);

您正在尝试将binarySearch应用于原始未排序的数组。 二进制搜索方法仅适用于已排序的数组。

答案 1 :(得分:0)

您不需要在排序和二分查找中执行此操作,即O(n log n)及时O(n)存储。您可以在O(n)时间和O(1)存储中执行此操作,直接在输入数组上工作:

int next_smallest_index = -1;
for (int i = 0; i < arr1.length; ++i) {
  if (i == current_smallest_index) continue;

  if (arr1[i] >= arr1[current_smallest_index]) {
    if (next_smallest_index == -1 || arr1[i] < arr1[next_smallest_index]) {
      next_smallest_index = i;
    }
  }
}

此外,这会直接为您提供元素的索引:如果您已对列表进行了排序,则您丢失了订购信息,因此您需要返回并搜索具有您找到的值的元素。