我知道这是一个非常着名的问题,并且已经提供了很多答案,但我正在尝试在我自己的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);
}
请忽略边界条件和逻辑错误,因为这是草稿版本。
答案 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;
}