Sorting element of an array by frequency in decreasing order - GeeksforGeeks

21 Apr, 2022
Given an array arr[] of N integers. The task is to sort the array arr[] according to the frequency of elements in decreasing order. Note: If the frequencies of the two elements are the same, then the smaller element should come first.
Examples:  
Input: arr[] = { 4, 4, 5, 6, 4, 2, 2, 8, 5 } Output: 4 4 4 2 2 5 5 6 8
Input: arr[] = { 9, 9, 5, 8, 5 } Output: 5 5 9 9 8   
Approach: 
Store the frequency of all elements in array arr[].
For arr[] = { 4, 4, 5, 6, 4, 2, 2, 8, 5 }The frequency array of the above array is:freq[] = { 0, 0, 2, 0, 3, 2, 0, 1, 0, 1}
Traverse the frequency array and for all the element having frequency greater than 1, update the value in the array arr[] as:
freq[2] = 2 arr[0] = 100000*freq[2] + (100000 – 2) = 299998 freq[4] = 3 arr[1] = 100000*freq[2] + (100000 – 4) = 399996 freq[5] = 2 arr[2] = 100000*freq[2] + (100000 – 5) = 299995 freq[6] = 2 arr[3] = 100000*freq[2] + (100000 – 6) = 199994 freq[8] = 2 arr[4] = 100000*freq[2] + (100000 – 2) = 199994 Now array becomes: arr[] = {299998, 399996, 299995, 199994, 199992, 2, 2, 8, 5}  
Sort the array arr[] in decreasing order.
Traverse the array arr[] and to get the element and frequency of that element as per the updation of array element in step 2, do the following:
To get the frequency of current element: frequency = arr[i]/100000; To get the value: value = 100000 – arr[i]%100000  
For Example:  
if arr[i] = 399996 frequency = arr[i]/100000 = 399996/100000 = 3 value = 100000 – arr[i]%100000 = 100000 – 99996 = 4 The element 4 is having frequency 3.  
For each element in arr[] find the value and frequency(say f) at each index and print the value f number of times.
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to sort an array in// decreasing order of their frequency#include "bits/stdc++.h"using namespace std; // Function that return the index// upto all the array elements are// updated.int sortByFreq(int* arr, int n){     // Initialise maxE = -1    int maxE = -1;     // Find the maximum element of    // arr[]    for (int i = 0; i < n; i++) {        maxE = max(maxE, arr[i]);    }     // Create frequency array freq[]    int freq[maxE + 1] = { 0 };     // Update the frequency array as    // per the occurrence of element in    // arr[]    for (int i = 0; i < n; i++) {        freq[arr[i]]++;    }     // Initialise cnt to 0    int cnt = 0;     // Traversing freq[]    for (int i = 0; i <= maxE; i++) {         // If freq of an element is        // greater than 0 update the        // value of arr[] at index cnt        // & increment cnt        if (freq[i] > 0) {             int value = 100000 - i;            arr[cnt] = 100000 * freq[i] + value;            cnt++;        }    }     // Return cnt    return cnt;} // Function that print array arr[]// elements in sorted ordervoid printSortedArray(int* arr, int cnt){     // Traversing arr[] till index cnt    for (int i = 0; i < cnt; i++) {         // Find frequency of elements        int frequency = arr[i] / 100000;         // Find value at index i        int value = 100000 - (arr[i] % 100000);         // Traversing till frequency        // to print value at index i        for (int j = 0; j < frequency; j++) {            cout << value << ' ';        }    }} // Driver codeint main(){     int arr[] = { 4, 4, 5, 6, 4, 2, 2, 8, 5 };     // Size of array arr[]    int n = sizeof(arr) / sizeof(arr[0]);     // Function call to get cnt    int cnt = sortByFreq(arr, n);     // Sort the arr[] in decreasing order    sort(arr, arr + cnt, greater<int>());     // Function that prints elements    // in decreasing order    printSortedArray(arr, cnt);     return 0;}
// Java program to sort an array in// decreasing order of their frequencyimport java.util.*; class GFG{  // Function that return the index// upto all the array elements are// updated.static int sortByFreq(Integer []arr, int n){      // Initialise maxE = -1    int maxE = -1;      // Find the maximum element of    // arr[]    for (int i = 0; i < n; i++) {        maxE = Math.max(maxE, arr[i]);    }      // Create frequency array freq[]    int freq[] = new int[maxE + 1];      // Update the frequency array as    // per the occurrence of element in    // arr[]    for (int i = 0; i < n; i++) {        freq[arr[i]]++;    }      // Initialise cnt to 0    int cnt = 0;      // Traversing freq[]    for (int i = 0; i <= maxE; i++) {          // If freq of an element is        // greater than 0 update the        // value of arr[] at index cnt        // & increment cnt        if (freq[i] > 0) {              int value = 100000 - i;            arr[cnt] = 100000 * freq[i] + value;            cnt++;        }    }      // Return cnt    return cnt;}  // Function that print array arr[]// elements in sorted orderstatic void printSortedArray(Integer []arr, int cnt){      // Traversing arr[] till index cnt    for (int i = 0; i < cnt; i++) {          // Find frequency of elements        int frequency = arr[i] / 100000;          // Find value at index i        int value = 100000 - (arr[i] % 100000);          // Traversing till frequency        // to print value at index i        for (int j = 0; j < frequency; j++) {            System.out.print(value + " ");        }    }}  // Driver codepublic static void main(String[] args){      Integer arr[] = { 4, 4, 5, 6, 4, 2, 2, 8, 5 };      // Size of array arr[]    int n = arr.length;      // Function call to get cnt    int cnt = sortByFreq(arr, n);      // Sort the arr[] in decreasing order    Arrays.sort(arr, Collections.reverseOrder());      // Function that prints elements    // in decreasing order    printSortedArray(arr, cnt);  }} // This code is contributed by sapnasingh4991
# Python program to sort an array in# decreasing order of their frequency # Function that return the index# upto all the array elements are# updated.def sortByFreq(arr, n):     # Initialise maxE = -1    maxE = -1;     # Find the maximum element of    # arr[]    for i in range(n):        maxE = max(maxE, arr[i])     # Create frequency array freq[]    freq = [0]*(maxE + 1);     # Update the frequency array as    # per the occurrence of element in    # arr[]    for i in range(n):        freq[arr[i]] += 1;         # Initialise cnt to 0    cnt = 0;     # Traversing freq[]    for i in range(maxE+1):         # If freq of an element is        # greater than 0 update the        # value of arr[] at index cnt        # & increment cnt        if (freq[i] > 0):             value = 100000 - i;            arr[cnt] = 100000 * freq[i] + value;            cnt += 1;             # Return cnt    return cnt; # Function that print array arr[]# elements in sorted orderdef printSortedArray(arr, cnt):     # Traversing arr[] till index cnt    for i in range(cnt):         # Find frequency of elements        frequency = arr[i] / 100000;         # Find value at index i        value = 100000 - (arr[i] % 100000);         # Traversing till frequency        # to print value at index i        for j in range(int(frequency)):            print(value, end=" ")             # Driver codeif __name__=='__main__':     arr = [ 4, 4, 5, 6, 4, 2, 2, 8, 5 ]     # Size of array arr[]    n = len(arr)     # Function call to get cnt    cnt = sortByFreq(arr, n);     # Sort the arr[] in decreasing order    arr.sort(reverse = True)     # Function that prints elements    # in decreasing order    printSortedArray(arr, cnt); # This code is contributed by Princi Singh
// C# program to sort an array in// decreasing order of their frequencyusing System; class GFG {   // Function that return the index  // upto all the array elements are  // updated.  static int sortByFreq(int[] arr, int n)  {     // Initialise maxE = -1    int maxE = -1;     // Find the maximum element of    // arr[]    for (int i = 0; i < n; i++)    {      maxE = Math.Max(maxE, arr[i]);    }     // Create frequency array freq[]    int[] freq = new int[maxE + 1];     // Update the frequency array as    // per the occurrence of element in    // arr[]    for (int i = 0; i < n; i++)    {      freq[arr[i]]++;    }     // Initialise cnt to 0    int cnt = 0;     // Traversing freq[]    for (int i = 0; i <= maxE; i++)    {       // If freq of an element is      // greater than 0 update the      // value of arr[] at index cnt      // & increment cnt      if (freq[i] > 0)      {        int value = 100000 - i;        arr[cnt] = 100000 * freq[i] + value;        cnt++;      }    }     // Return cnt    return cnt;  }   // Function that print array arr[]  // elements in sorted order  static void printSortedArray(int[] arr, int cnt)  {     // Traversing arr[] till index cnt    for (int i = 0; i < cnt; i++)    {       // Find frequency of elements      int frequency = arr[i] / 100000;       // Find value at index i      int value = 100000 - (arr[i] % 100000);       // Traversing till frequency      // to print value at index i      for (int j = 0; j < frequency; j++)      {        Console.Write(value + " ");      }    }  }   // Driver code  public static void Main()  {    int[] arr = { 4, 4, 5, 6, 4, 2, 2, 8, 5 };     // Size of array arr[]    int n = arr.Length;     // Function call to get cnt    int cnt = sortByFreq(arr, n);     // Sort the arr[] in decreasing order    Array.Sort(arr);    Array.Reverse(arr);     // Function that prints elements    // in decreasing order    printSortedArray(arr, cnt);  }} // This code is contributed by subhamahato348
<script>       // JavaScript program to sort an array in      // decreasing order of their frequency             // Function that return the index      // upto all the array elements are      // updated.      function sortByFreq(arr, n) {        // Initialise maxE = -1        var maxE = -1;         // Find the maximum element of        // arr[]        for (var i = 0; i < n; i++) {          maxE = Math.max(maxE, arr[i]);        }         // Create frequency array freq[]        var freq = new Array(maxE + 1).fill(0);         // Update the frequency array as        // per the occurrence of element in        // arr[]        for (var i = 0; i < n; i++) {          freq[arr[i]]++;        }         // Initialise cnt to 0        var cnt = 0;         // Traversing freq[]        for (var i = 0; i <= maxE; i++) {          // If freq of an element is          // greater than 0 update the          // value of arr[] at index cnt          // & increment cnt          if (freq[i] > 0) {            var value = 100000 - i;            arr[cnt] = 100000 * freq[i] + value;            cnt++;          }        }         // Return cnt        return cnt;      }       // Function that print array arr[]      // elements in sorted order      function printSortedArray(arr, cnt) {        // Traversing arr[] till index cnt        for (var i = 0; i < cnt; i++) {          // Find frequency of elements          var frequency = parseInt(arr[i] / 100000);           // Find value at index i          var value = 100000 - (arr[i] % 100000);           // Traversing till frequency          // to print value at index i          for (var j = 0; j < frequency; j++) {            document.write(value + " ");          }        }      }       // Driver code      var arr = [4, 4, 5, 6, 4, 2, 2, 8, 5];       // Size of array arr[]      var n = arr.length;       // Function call to get cnt      var cnt = sortByFreq(arr, n);       // Sort the arr[] in decreasing order      arr.sort((a, b) => b - a);       // Function that prints elements      // in decreasing order      printSortedArray(arr, cnt);       </script>
4 4 4 2 2 5 5 6 8
 
Time Complexity: O(N*log N) Auxiliary Space: O(N)
STL Pair and Comparator based approach :
Approach:
1. Store the frequency of each element in a map.
2. Iterate the map and store the each element and it’s frequency in a vector of pairs.
3. Pass a comparator which sorts the elements in decreasing order of their frequency and by elements value if frequency is equal.
4.Push the elements their frequency number of times inside the final array.
C++
Python3
Javascript
#include<bits/stdc++.h>using namespace std;bool compare(pair<int,int>p1,pair<int,int>p2){    if(p1.second==p2.second) //if frequency is equal    {        return p1.first<p2.first; //return the smaller value    }    return p1.second>p2.second; //return the element with greater frequency}int main(){    vector<int>arr={4,4,5,6,4,2,2,8,5};    int n=arr.size();    map<int,int>m;    for(int i=0;i<n;i++)    {        m[arr[i]]+=1;    }    vector<pair<int,int>>a;    for(auto it=m.begin();it!=m.end();it++)    {        a.push_back(make_pair(it->first,it->second)); //making pair of element and it's frequency    }    sort(a.begin(),a.end(),compare);    vector<int>ans;    for(auto x:a)    {        while(x.second--)        {        ans.push_back(x.first);        }    }    for(auto x:ans)    {        cout<<x<<" ";    }    return 0;}
# Python code for the approachfrom functools import cmp_to_key def compare(p1, p2):     if(p1[1] == p2[1]): #if frequency is equal        return p1[0] - p2[0] #return the smaller value         return p2[1] - p1[1] #return the element with greater frequency # driver codearr = [4, 4, 5, 6, 4, 2, 2, 8, 5]n = len(arr)m = {}for i in range(n):     if(arr[i] in m):        m[arr[i]] = m[arr[i]] + 1     else:        m[arr[i]] = 1 a = []for x,y in m.items():    a.append([x,y]) #making pair of element and it's frequency a.sort(key = cmp_to_key(compare))ans = []for x in a:    while(x[1]):        ans.append(x[0])        x[1] -= 1 for x in ans:    print(x, end = " ") # This code is contributed by shinjanpatra
<script> // JavaScript code for the approachfunction compare(p1, p2){    if(p1[1] == p2[1]) //if frequency is equal    {        return p1[0] - p2[0]; //return the smaller value    }    return p2[1] - p1[1]; //return the element with greater frequency} // driver codelet arr = [4,4,5,6,4,2,2,8,5];let n = arr.length;let m = new Map();for(let i = 0; i < n; i++){    if(m.has(arr[i])){        m.set(arr[i], m.get(arr[i]) + 1);    }    else m.set(arr[i],1);}let a = [];for(let [x,y] of m){    a.push([x,y]); //making pair of element and it's frequency}a.sort(compare);let ans = [];for(let x of a){    while(x[1]--){        ans.push(x[0]);    }}for(let x of ans){    document.write(x," ");} // This code is contributed by shinjanpatra </script>
4 4 4 2 2 5 5 6 8 
 
princi singh
sapnasingh4991
subhammahato348
rdtank
arorakashish0911
akshaysingh98088
adityamutharia
shinjanpatra
frequency-counting
Arrays
Sorting
Arrays
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element