二进制搜索java中的整数数组

时间:2015-01-22 21:38:54

标签: java arrays algorithm binary-search

我知道这是一个非常着名的问题,并且已经提供了很多答案,但我正在尝试在我自己的java中实现二进制搜索算法。

首先得到以下编译错误,为什么?

  

此方法必须返回int

类型的结果

其次,这种方法与this famous solution

的区别
public static int binarySearch(int test[], int num){

    int midLength = test.length/2;
    int fullLength = test.length;

    if(num > test[midLength]){
        int newArray[] = new int[fullLength - midLength];
        for (int j = 0; j<= midLength ; j++){
            newArray[j] = test[midLength + j];

        }
        return binarySearch(newArray, num);
    }
    else if(num < test[midLength]){
        int newArray[] = new int[midLength];
        for (int j = 0; j<= fullLength - midLength ; j++){
            newArray[j] = test[j];

        }
        return binarySearch(newArray, num);
    }
    else if(num == test[midLength]){
        return test[midLength];
    }

}

public static void main(String[] args) {
    int test[] = {2,8,1,6,4,6};
    Arrays.sort(test);
    int num = ArraysTest.binarySearch(test, 1);
    System.out.println(num);
}

请忽略边界条件和逻辑错误,因为这是草稿版本。

3 个答案:

答案 0 :(得分:2)

return功能结束时缺少binarySearch。在Java中,编译器验证在每个可能的执行路径上都存在正确类型的返回。在你的情况下,如果所有测试都是假的,那么执行会在没有returned值的函数结束时上升,违反了函数契约。

您的算法与您引用的算法的不同之处在于您在每次“拆分”中构造新数组的方式。所以,我们可以说效率相对较低,因为你在没有任何实际需要的情况下使用了太多内存。

答案 1 :(得分:0)

您的binarySearch()方法中没有“else”子句。可以通过在方法结束时添加return语句来完成此秋季案例。换句话说,“其他”不必是明确的。编译器认为有可能没有任何测试(if和else-ifs)通过,因此该方法不返回任何内容。此外,由于该方法是递归的,它必须有一个默认(转义)子句。否则,它将永远自称。因此,只需删除else-if周围的return test[midLength];

答案 2 :(得分:0)

Jean是对的,你没有在函数的最后一个返回任何值,所以如果不是条件和else-if条件得到的话,那该怎么办。

当你使用else时的第二件事 - 如果你必须在最后提供else条件,那么代码也不会失败。

    int midLength = test.length/2;
    int fullLength = test.length;

    if(num > test[midLength]){
        int newArray[] = new int[fullLength - midLength];
        for (int j = 0; j<= midLength ; j++){
            newArray[j] = test[midLength + j];

        }
        return binarySearch(newArray, num);
    }
    else if(num < test[midLength]){
        int newArray[] = new int[midLength];
        for (int j = 0; j<= fullLength - midLength ; j++){
            newArray[j] = test[j];

        }
        return binarySearch(newArray, num);
    }
    else if(num == test[midLength]){
        return test[midLength];
    }

    //if it is not matched with any conditions above.
    else{
        return 0;
    }