我编写了一小段代码来确定数组中下一个较小元素的索引。代码片段如下:
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。
请帮忙。
答案 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;
}
}
}
此外,这会直接为您提供元素的索引:如果您已对列表进行了排序,则您丢失了订购信息,因此您需要返回并搜索具有您找到的值的元素。