我正在尝试使用此代码,因为这对我目前正在进行的项目至关重要。
import java.util.Scanner;
public class BinarySearch
{
int binarySearch(int arr[], int l, int r, int x)
{
if (r>=l)
{
int mid = l + (r - l)/2;
if (arr[mid] == x)
return mid;
if (arr[mid] > x)
return binarySearch(arr, l, mid-1, x);
return binarySearch(arr, mid+1, r, x);
}
return -1;
}
public static void main(String args[])
{
BinarySearch ob = new BinarySearch();
Scanner sc = new Scanner(System.in);
System.out.println("Enter number of inputs:");
int i = sc.nextInt();
int arr[] = new int[i];
System.out.println("Enter array of inputs:");
for(int j = 0;j < i; j++){
arr[j] = sc.nextInt();
}
System.out.println("What number do you want the index from");
int n = arr.length;
int x = sc.nextInt();
int result = ob.binarySearch(arr,0,n-1,x);
if (result == -1)
System.out.println("FAILURE");
else
System.out.println("Element found at index "+result + ".");
}
}
我希望结果是正常输入,数组可以在其中起作用。 我得到的实际结果是&#34;可能有无限循环的超时错误。&#34;
答案 0 :(得分:1)
binarySearch对我来说似乎很好。
但二进制搜索仅适用于排序的数组(通过比较)。
超时确实意味着循环或递归不会结束。 考虑
int mid = l + (r - l)/2
binarySearch(arr, l, mid-1, x);
适用于[l, <r]
(较小)binarySearch(arr, mid+1, r, x);
适用于[>l, r]
(较小)递归将终止。
即使在无序阵列上(产生垃圾)。
看起来更像是扫描仪的使用存在问题。我没有看到hasNextLine
,hasNextInt
,nextInt
和nextLine
的使用情况。
班级Arrays可以提供sort
(并且还有自己的binarySearch
)。
<强> 代码 强>
未经过测试,通常我不会将Scanner
用于System.in
,
所以可能写得更简洁:
BinarySearch ob = new BinarySearch();
Scanner sc = new Scanner(System.in);
System.out.println("Enter number of inputs:");
if (sc.hasNextLine() && sc.hasNextInt()) {
int i = sc.nextInt();
sc.nextLine();
int arr[] = new int[i];
int n = arr.length;
System.out.println("Enter array of inputs:");
for (int j = 0; j < i; j++) {
if (sc.hasNextLine() && sc.hasNextInt()) {
arr[j] = sc.nextInt();
sc.nextLine();
} else {
...
System.exit(1);
}
}
// Important, binary search relies on the array being sorted:
Arrays.sort(arr);
System.out.printf("The sorted array is %s%n", Arrays.toString(arr));
System.out.println("What number do you want the index from?");
if (sc.hasNextLine() && sc.hasNextInt()) {
int x = sc.nextInt();
sc.nextLine();
int result = ob.binarySearch(arr, 0, n-1, x);