Search code examples
javaarraysbigdecimal

Big Decimal array not sorting 0 and 000.000


I was solving a java HackerRank problem in which I had to sort an array consisting decimal numbers using BigDecimal class in descending order. The solution works fine except for one case in which 0 and 000.000 comes. Now as they are equal, the problem tells us not keep them in the same order of their occurrence, but it is not happening.

My Code:

    import java.io.*;
    import java.math.*;
    import java.util.*;
    
    public class Solution {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            String [] array = new String[n];
            for(int i=0; i<array.length; i++){
                array[i] = input.next();
            }
            String temp;
            for(int i= array.length-1; i>=0; i--){
                for(int j=i-1; j>=0; j--){
                    if(new BigDecimal(array[i]).compareTo(new BigDecimal(array[j]))>0){
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
            }
            for(int i=0; i<array.length; i++){
                System.out.println(array[i]);
            }          
        }
    }

Sample Input : 9 ---> the size of array

  1. -100
  2. 50
  3. 0
  4. 56.6
  5. 90
  6. 0.12
  7. .12
  8. 02.34
  9. 000.000

Solution

  • You problem is stability of sort. You should select a stable sort algorithm. Insertion sort is such one.

    String temp;
    for (int i = 0; i < n; i++) {
        for (int j = i; j > 0
            && new BigDecimal(array[j - 1]).compareTo(new BigDecimal(array[j])) < 0; j--) {
            temp = array[j - 1];
            array[j - 1] = array[j];
            array[j] = temp;
        }
    }
    System.out.println(Arrays.toString(array));
    

    output:

    [90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]