← Back to questions
TCS NQT• Prep

Sort By Frequency

Here is the optimized solution in Java. Copy or view it below.
Java
package Problems_on_Arrays;

import java.util.Arrays;

public class SortByFrequency {
    public static void swap(int[][] arr, int i, int j) {
        int temp1 = arr[0][i];
        arr[0][i] = arr[0][j];
        arr[0][j] = temp1;

        int temp2 = arr[1][i];
        arr[1][i] = arr[1][j];
        arr[1][j] = temp2;
    }

    // Function to sort 2d array by frequency
    public static void sort2darray(int[][] array2d, int k) {
        for (int i = 0; i < k - 1; i++) {
            for (int j = 0; j < k - 1 - i; j++) {
                if (array2d[1][j] < array2d[1][j + 1]) {
                    swap(array2d, j, j + 1);
                }
            }
        }
    }

    // Function to sort elements of array by frequency
    public static void Sortele(int[] arr, int n) {
        // Step 1: Sort the array
        Arrays.sort(arr, 0, n);
        // Step 2: Create a 2d array
        int[][] arr2d = new int[2][100];
        int k = 0;
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                arr2d[0][k] = arr[i];
                count = 1;
            } else if (arr[i] == arr[i - 1]) {
                count++;
            } else {
                arr2d[1][k] = count;
                count = 1;
                k++;
                arr2d[0][k] = arr[i];
            }
        }
        arr2d[1][k] = count;
        k++;

        // Step 3: sort the 2d array according to frequency
        sort2darray(arr2d, k);

        // Step 4: Store the answer in original array
        k = 0;
        int i = 0;
        while (i < n) {
            while (arr2d[1][k] > 0) {
                arr[i] = arr2d[0][k];
                i++;
                arr2d[1][k]--;
            }
            k++;
        }
    }

    public static void main(String args[]) {
        int n = 8;
        int[] arr = { 1, 2, 3, 2, 4, 3, 1, 2 };
        Sortele(arr, n);
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }

    }
}