Search code examples
javasortingbinary-searchselection-sort

Why doesn't the binary search method work if the array is sorted in descending order?


The binary search method is used to find out values from the sorted array which it is not doing. I know the issue involves sorting it in descending order but It won't work can someone help me figure out the issue. The descending method is a selection sort if it helps. I think the issue is with the method only being able to find the value form an ascending order array but don't know how to make it work on a descending order array

package project;

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

public class project {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int Size;//size of the array
        int order; // ascending or descending order
        System.out.println("Put in the amount of expenses you have");
        Size = sc.nextInt();//User input for the amount of expenses
        System.out.println("put in all your expenses");
        int userInput[] = new int[Size];// what the users expenses are
        for (int i = 0; i < userInput.length; i++)//This loop is for if the i value is smaller than user input then put in more values to complete the array
            userInput[i] = sc.nextInt();
        System.out.println("do you want it ascending or descending order. If you want it in ascending press 1 or if you want descending press 2");
        order = sc.nextInt();// select if they wanted it in ascending or descending order
        System.out.print("expenses not sorted : ");
        printExpenses(userInput);
        if (order == 1) {
            expensesAscending(userInput);// If order is equal to one then sort in ascending else if it is equal to 2 then order it descending
        } else if (order == 2) {
            expensedescending(userInput);

        }
        int ans = binarySearch(userInput, 0, Size, 10);
        System.out.println(ans);
        if(ans == -1)
            System.out.println("Key not found");
          else
            System.out.println("Key found at position " + (ans));
    }

    public static void printExpenses(int[] arr) {
        // this is were it is printed
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "$");
        }
    }

    public static void expensedescending(int arr[]) {
        // This is were the selection sort starts
        int N = arr.length;
        for (int i = 0; i < N; i++) {
            int small = arr[i];
            int pos = i;
            for (int j = i + 1; j < N; j++) {
                if (arr[j] > small) {
                    small = arr[j];
                    pos = j;
                }
            }
            int temp = arr[pos];
            arr[pos] = arr[i];
            arr[i] = temp;
            System.out.println(": ");
            // Printing array after pass
            printExpenses(arr);
        }
    }

    public static void expensesAscending(int arr[]) {
        int N = arr.length;
        for (int i = 1; i < N; i++) {
            int j = i - 1;
            int temp = arr[i];
            while (j >= 0 && temp < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
                ;
            }
            arr[j + 1] = temp;
            System.out.println(": ");
            // Printing array after pass
            printExpenses(arr);
        }
    }
    static int binarySearch(int[] array, int left, int right, int key) {
        if (left > right) {
          return -1;
        }

        int mid = (left + right) / 2;

        if (array[mid] == key) {
          return mid;
        }

        if (array[mid] > key) {
          return binarySearch(array, left, mid - 1, key);
        }

        return binarySearch(array, mid + 1, right, key);
      }



}

Solution

  • You are trying binary search of a Ascending order sorted array on a Descending order sorted array. Change your method header and method body like this:

    int ans = binarySearch(userInput, 0, Size, 10,order);  // order you got from user 
    

    Now this Binary search will work on both Ascending and Descending order of array:

        static int binarySearch(int[] array, int left, int right, int key,int sorting) 
        {
            if (left > right) 
            {
              return -1;
            }
    
            int mid = (left + right) / 2;
    
            if (array[mid] == key) 
            {
              return mid;
            }
    
            if(sorting == 2)   // if array is sorted in descending order
            {
                if (array[mid] > key) 
                {
                  return binarySearch(array, mid+1, right, key,sorting );
                }
                return binarySearch(array, left, mid-1, key,sorting );
            }
            else // if array is sorted in ascnending order
            {
                if (array[mid] > key) 
                {
                    return binarySearch(array, left, mid - 1, key,sorting );
                }
    
                return binarySearch(array, mid + 1, right, key,sorting );
            }
        }