为什么我的二进制搜索无法正常工作

时间:2020-07-05 13:27:44

标签: java arrays

给出一个长度为N的元素数组,范围从0到N –1。所有元素可能不存在于该数组中。如果不存在element,则数组中将存在-1。重新排列数组,使A [i] = i,如果i不存在,则在该位置显示-1

这就是问题所在,但是我的binarySearch无法正常工作,为什么?

for(int i = 0; i < size; i++) {
            
        int res = i;
        //  System.out.println(Arrays.binarySearch(arr,res));
        int result = Arrays.binarySearch(arr,res);
    
            if(result == -1)
                arr[i] = -1;
            else {
                arr[i] = i;
            }
}
for(int i = 0; i < size; i++) {
    System.out.print(arr[i]+" ");
}

2 个答案:

答案 0 :(得分:1)

如果可以使用其他阵列,则解决方法可能如下:

  1. 创建结果数组
  2. 用-1填充结果数组
  3. 遍历输入数组,并在结果数组中填充适当的数字。
    // input array
    int[] arr = {-1, 2, 3, 0};
        
    // prepare new resulting array
    int[] res = new int[arr.length];
    // fill with -1
    // Arrays.fill(res, -1);  // use this shortcut if you're allowed to use library
    for (int i = 0; i < res.length; i++) {
        res[i] = -1;
    }
    // rearrange
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != -1) {
            res[arr[i]] = arr[i];
        }
    }
    System.out.println("input data: " + Arrays.toString(arr));
    System.out.println("rearranged: " + Arrays.toString(res));

输出:

input data: [-1, 2, 3, 0]
rearranged: [0, -1, 2, 3]

更新

不使用额外数组的递归解决方案:

public static void test() {
    int[] arr = {-1, 4, 2, 0, 1, 3};
    System.out.println("input data: " + Arrays.toString(arr));
        
    // rearrange
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != -1 && arr[i] != i) {
            swapAtIndex(arr, i);
        }
    }
    System.out.println("rearranged: " + Arrays.toString(arr));
}

private static void swapAtIndex(int[] arr, int i) {
    int t = arr[i];
    if (t != -1 && t != i) {
        int t2 = arr[t];
        arr[t] = t;
        arr[i] = t2;
        if (t2 != -1) {
            swapAtIndex(arr, i); // continue swapping at the same index
        }
    }
}

输出:

input data: [-1, 4, 2, 0, 1, 3]
rearranged: [0, 1, 2, 3, 4, -1]

对于没有-1的输入数组,您将在重新排列后得到一个排序后的数组:

input data: [5, 4, 2, 0, 1, 3]
rearranged: [0, 1, 2, 3, 4, 5]

答案 1 :(得分:0)

二进制搜索仅适用于排序数组。尝试使用其他搜索算法