代码中的错误(需要帮助)

时间:2017-12-04 23:28:28

标签: java arrays int binary-search

我正在尝试使用此代码,因为这对我目前正在进行的项目至关重要。

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;

1 个答案:

答案 0 :(得分:1)

binarySearch对我来说似乎很好。

但二进制搜索仅适用于排序的数组(通过比较)。

超时确实意味着循环或递归不会结束。 考虑

  • 递归的情况:l&lt; = r
  • 给出int mid = l + (r - l)/2
  • 因此l&lt; = mid&amp;&amp; mid&lt; = r
  • 然后binarySearch(arr, l, mid-1, x);适用于[l, <r](较小)
  • 然后binarySearch(arr, mid+1, r, x);适用于[>l, r](较小)

递归将终止。

即使在无序阵列上(产生垃圾)。

看起来更像是扫描仪的使用存在问题。我没有看到hasNextLinehasNextIntnextIntnextLine的使用情况。

班级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);