我正在尝试构建一个遍历排序数组的binarySearch方法,并评估是否存在给定为 int target 的元素。它将通过评估平均值是大于还是小于目标值来实现,并相应地循环遍历数组的第一个或第二个。
我认为我的基本代码已经失效,但我遇到了一些问题:
我认为它与我在各自if语句中的语句有关,但我试图调试但不能。另外,我不允许使用库方法。 希望这个问题对像我这样的其他初学者有用。我认为它探索了一些java概念,如语法,逻辑和基本用法。感谢您的帮助。
public class ArrayUtilities
{
public static void main(String[] args)
{
int[] arrayBeingSearched = {0, 3, 6, 9, 12, 15, 19, 21, 90};
int target = 90;
System.out.println("linear: " + linearSearch(arrayBeingSearched, target));
System.out.println("binary: " + binarySearch(arrayBeingSearched, target));
}
public static boolean binarySearch(int[] arrayBeingSearched, int target)
{
boolean binarySearch = false;
for (int i = 0; i < arrayBeingSearched.length; i++){
int left = 0; //array lower bound
int right = arrayBeingSearched.length - 1; //array upper bound
int middle = ((right - left) / (2)); //array mean
if(arrayBeingSearched[middle] == target){
binarySearch = true;
}
else if(arrayBeingSearched[middle] < target){
for(int j = middle + 1; j < arrayBeingSearched.length - 1; j ++){
int newLeft = arrayBeingSearched[j ++];
if(arrayBeingSearched[newLeft] == target){
binarySearch = true;
break;
}
else{
binarySearch = false;
}
}
}
else if(arrayBeingSearched[middle] > target)
for(int l = 0; l < middle - 1; l ++){
int newRight = arrayBeingSearched[l ++];
if(arrayBeingSearched[newRight] == target){
binarySearch = true;
break;
}
else{
binarySearch = false;
}
}
else{
binarySearch = false;
}
}
return binarySearch;
}
}
好的,根据评论,这会更好吗?第一条评论主要回答了我的问题,但我只是想跟进:
public static boolean binarySearch(int[] array, int target)
{
int start = 0;
int end = array.length - 1;
while (start <= end)
{
int middle = start + (end - start)/2;
if (array[middle] == target) {
return true;
}
else if (array[middle] > target)
{
end = middle - 1;
}
else start = middle + 1;
}
return false;
}
}
答案 0 :(得分:3)
这是一个糟糕的开始:
for (int i = 0; i < arrayBeingSearched.length; i++)
这是一个线性搜索,其中包含其他内容。我没有完全按照你正在做的事情,但我认为你应该重新开始......在你面前描述二进制搜索。
通常二进制搜索循环类似于:
int left = 0; // Inclusive lower bound
int right = arrayBeingSearch.length; // Exclusive upper bound
while (left < right) {
// Either change left, change right, or return success
// based on what you find
}
答案 1 :(得分:1)
如果您的中间元素小于目标,则执行此操作
int newLeft = arrayBeingSearched[j ++];
if(arrayBeingSearched[newLeft] == target) //...
当它更大时等效。
也就是说,您正在获取数组的元素并将其用作索引。您的数组只能包含一个值为1000的元素,这就是您遇到ArrayIndexOutOfBoundsException的原因。
答案 2 :(得分:0)
我确定还有其他问题(请参阅Jon的回答),但我想提一下这样的代码:
for(int j = middle + 1; j < arrayBeingSearched.length - 1; j ++){
int newLeft = arrayBeingSearched[j ++];
不会做你想要的。 for
语句表示每次程序进入循环时,它都会将{1}添加1(在循环代码的末尾)。但是下一个语句将使用j
作为索引,然后向其添加1。结果是,每次进行循环时,1将被添加到j
两次,因此您基本上只查看其他所有元素。如果这是正确的(我认为不是这样),我会说你肯定需要从第二行删除j
。