gpt4 book ai didi

java - 不带库方法的二分查找

转载 作者:行者123 更新时间:2023-12-01 18:41:35 24 4
gpt4 key购买 nike

我正在尝试构建一个 binarySearch 方法,该方法遍历排序数组,并评估以 int target 形式给出的给定元素是否存在。它将通过评估平均值是否大于或小于目标值来实现此目的,并相应地循环遍历数组的前半部分或后半部分。

我认为我已经掌握了基本代码,但遇到了一些问题:

  • int 目标 = 0; (返回true)=>正确
  • int 目标 = (3, 6, 9); (返回 false)=> 应该返回 true
  • int 目标 = (15, 19, 21, 90);返回“java.lang.ArrayIndexOutOfBoundsException:15”=>应该为true

我想这与我在各自的 if 情况下的 for 语句有关,但我尝试过调试但不能。另外,我不允许使用库方法。希望这个问题对像我这样的其他初学者有帮助。我认为它探讨了一些 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;
}
}

最佳答案

这是一个糟糕的开始:

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
}

关于java - 不带库方法的二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com