Search code examples
javaeclipsebinary-search

Why does this binary search code give wrong output on Eclipse IDE?


Why does this binary search code give wrong output on Eclipse IDE but gets accepted when submitted to Coursera? This is a sample input for which it shows the wrong output.

Sample Input:
5 3 2 4 1 5
3 1 2 7

Output:
-1 -1 -1

Clearly, the element '1' is present is the input array. But the output for that is -1 instead of 3.

import java.io.*;
import java.util.*;

public class BinarySearch {

    static int binarySearch(int[] a,int l,int r,int x) {
        //write your code here
    if(l<=r){
    int mid =l + (r - l)/2;
    if(x==a[mid])
        return mid;
    else if(x<a[mid]){
        return binarySearch(a,l,mid-1,x);
    }
    else
        return binarySearch(a,mid+1,r,x);
    }
        return -1;
    }

    public static void main(String[] args) {
        FastScanner scanner = new FastScanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
        }
        int m = scanner.nextInt();
        int[] b = new int[m];
        for (int i = 0; i < m; i++) {
          b[i] = scanner.nextInt();
        }
        for (int i = 0; i < m; i++) {
            //replace with the call to binarySearch when implemented
            System.out.print(binarySearch(a,0,n-1,b[i]) + " ");
        }
    }
    static class FastScanner {
        BufferedReader br;
        StringTokenizer st;

        FastScanner(InputStream stream) {
            try {
                br = new BufferedReader(new InputStreamReader(stream));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        String next() {
            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }
    }
}

Solution

  • Actually, the problem is with your input data and not the code itself. If you search information about binary search you can find: "binary search is a search algorithm that finds the position of a target value within a sorted array". Your input isn't sorted.

    You would have to sort the array before running the search which would be a bad idea - searching with other algorithm would take less time than sorting.

    If you try to input sorted data, eg.:

    5 1 2 3 4 5 
    3 1 2 7
    

    The result will be 0 1 -1 - just as expected.