2017-12-04 13 views
-3

私が現在取り組んでいるプロジェクトにとって不可欠なので、このコードを動作させようとしています。コードのエラー(ヘルプが必要です)

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 + "."); 
    } 
} 

私は結果が通常の入力であり、配列が機能すると期待しています。 私が実際に得られる結果は、「おそらく無限ループを起こしている」というタイムアウトエラーです。

+0

だけで簡単にヒント場合バイナリ検索を自分で実装することで問題を抱えていますが、バイナリ検索を実行する配列クラスにオーバーロードされた静的メソッドがあります。ここではhttps://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html – prsvr

+0

main()のxの値と同様に配列を出力します。 –

+0

'binary_search'メソッドに問題があります。常に正しい結果、3と-1を返します。それについて考える。私はそれを実行するときに "無限ループ"エラーがありませんでした。 – TheQuestioner

答えて

1

binarySearchはうまくいくようです。

ただし、バイナリ検索は並べ替えられた配列(比較したもの)でのみ動作します。

実際にはタイムアウトは、ループまたは再帰が終了しないことを意味します。再帰ため 考慮

  • 場合:L < = R
  • int mid = l + (r - l)/2
  • したがって、所与のL < =ミッド& &中間< = R
  • 次いで[l, <r](小さい)
  • binarySearch(arr, l, mid-1, x);作品次いでは[>l, r](小)に対応

再帰が終了します。

順不同の配列(ガベージを生み出す)でも。

スキャナの使い方に問題があるようです。 hasNextLinehasNextIntnextIntnextLineできれいな使い方が見られませんでした。

クラスArraysは、sort(また、独自のbinarySearch)を提供できます。


ので、おそらく、より簡潔に書くことができ、コード

テストされていない、と一般的に私はSystem.inためScannerを使用していない、 :

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); 
+0

助けてくれてありがとうが、前述のコードをどこでどのように修正するかを指摘できるだろうか?私はそれについて少し問題があります。 – Sarang

+0

修正されたコードを教えてください。私はIDEを使用しなかったので、私は多かれ少なかれ私が思っていることを願っています。 –