0

I was asked to sort and search an array. The sorting the array was simple and my code worked but then whenever I try to call the binary search method it works for the first element in the array but gives me "-1" as a result

My full code is as follows:

 public static void main(String[] args) {

    int[] array = new int[5];
    array[0] = 50;
    array[1] = 40;
    array[2] = 10;
    array[3] = 20;
    array[4] = 100;

sort(array, (array.length - 1));

      for (int x = 0; x < array.length; x++) {
        System.out.println(" " + array[x]);
    }
    System.out.println("");
    System.out.println("Binary search (R): " + rBsearch(array, 0, (array.length), 20));
}
    public static void sort(int[] a, int last) {
    if (last > 0) {
        int max = findMax(a, last);
        swap(a, last, max);
        sort(a, last - 1);
    }
}

public static int rBsearch(int[] L, int low, int high, int k) {


    int mid = (low + high) / 2;

    if (low > high) {
        return -1;
    } else if (L[mid] == k) {
        return mid;
    } else if (L[mid] < k) {
        return rBsearch(L, k, mid + 1, high);
    } else {
        return rBsearch(L, k, low, mid - 1);
    }
 }

public static int findMax(int[] arr, int last) {

    int max = 0;
    for (int i = 0; i <= last; i++) {
        if (arr[i] > arr[max]) {
            max = i;
        }
    }
    return max;
    }

public static void swap(int[] arr, int last, int max) {
    int temp = arr[last];
    arr[last] = arr[max];
    arr[max] = temp;
}
1
  • 1
    Have a look at your rBsearch method - look like you mix up bounds and key in the recursion calls. Maybe add a println to see whats actually happening. Commented Oct 21, 2013 at 10:53

4 Answers 4

3

You goofed up the binary search intervals

public static int rBsearch(int[] L, int low, int high, int k) {


    int mid = (low + high) / 2;

    if (low > high) {
        return -1;
    } else if (L[mid] == k) {
        return L[mid];
    } else if (L[mid] < k) {
        return rBsearch(L, mid + 1, high, k);
    } else {
        return rBsearch(L, low, mid - 1, k);
    }
 }
Sign up to request clarification or add additional context in comments.

1 Comment

I had a lot of things in mind while doing this! Anyways thanks!
2

You did a mistake in calling the rBsearch method in the following lines Instead of

else if (L[mid] < k) {
        return rBsearch(L, k, mid + 1, high); 
    } else {
        return rBsearch(L, k, low, mid - 1);
    }

You should use

else if (L[mid] < k) {
            return rBsearch(L,  mid + 1, high,k); //the order of the parameters
        } else {
            return rBsearch(L, low, mid - 1,k);
        }

Comments

0

Easiest way is: Convert you array to list: Arrays.asList(array)

For sort: Collections#sort

For search: Collections#binarySearch

See this

Comments

0
  1. Take Array From User
  2. Sort Array using Build-in Function of Java...
  3. then Search Element using Binary Search....

        import java.lang.reflect.Array;
        import java.util.Arrays;
        import java.util.Scanner;
    
        class BinarySearch
        {
           public static void main(String args[])
           {
              int array[];
    
              Scanner input = new Scanner(System.in);
              System.out.println("Enter number of elements:");
             int Size_Of_Array = input.nextInt(); 
    
    
              array = new int[Size_Of_Array];
    
              System.out.println("Enter " + Size_Of_Array + " integers");
    
              for (int counter = 0; counter < Size_Of_Array; counter++)
                  array[counter] = input.nextInt();
    
              Arrays.sort(array);
              System.out.println("Sorting Array is :-");
              for (int counter = 0; counter < Size_Of_Array; counter++)
                  System.out.println(array[counter]);
    
              System.out.println("Enter the search value:");
              int  Searching_item = input.nextInt();
    
              int First_Index=0;
              int Last_Index=Size_Of_Array-1;
              int Middle_Index=(First_Index+Last_Index)/2;
    
              while(First_Index <= Last_Index)
              {
                  if(array[Middle_Index] < Searching_item)
                  {
                      First_Index=Middle_Index+1;
                  }
                  else if ( array[Middle_Index] == Searching_item ) 
                  {
                    System.out.println(Searching_item + " found at location " + (Middle_Index + 1) + ".");
                    break;
                  }
                  else
                  {
                      Last_Index = Middle_Index - 1;
                  }
                  Middle_Index = (First_Index + Last_Index)/2;
    
                  if ( First_Index > Last_Index )
                  {
                      System.out.println(Searching_item + " is not found.\n");
                  }
              }
            }
        }
    

    Result of BinarySearch

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.