 Open in App
Not now

# Sort elements by frequency using STL

• Difficulty Level : Medium
• Last Updated : 17 Mar, 2023

Given an array of integers, sort the array according to frequency of elements. If frequencies of two elements are same, print them in increasing order. Examples:

```Input : arr[] = {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}
Output : 3 3 3 3 2 2 2 12 12 4 5
Explanation :
No. Freq
2  : 3
3  : 4
4  : 1
5  : 1
12 : 2```

We have discussed different approaches in below posts : Sort elements by frequency | Set 1 Sort elements by frequency | Set 2 We can solve this problem using map and pairs. Initially we create a map such that map[element] = freq. Once we are done building the map, we create an array of pairs. A pair which stores elements and their corresponding frequency will be used for the purpose of sorting. We write a custom compare function which compares two pairs firstly on the basis of freq and if there is a tie on the basis of values.

Below is its c++ implementation :

## CPP

 `// C++ program to sort elements by frequency using``// STL``#include ``using` `namespace` `std;` `// function to compare two pairs for inbuilt sort``bool` `compare(pair<``int``,``int``> &p1,``            ``pair<``int``, ``int``> &p2)``{``    ``// If frequencies are same, compare``    ``// values``    ``if` `(p1.second == p2.second)``        ``return` `p1.first < p2.first;``    ``return` `p1.second > p2.second;``}` `// function to print elements sorted by freq``void` `printSorted(``int` `arr[], ``int` `n)``{``    ``// Store items and their frequencies``    ``map<``int``, ``int``> m;``    ``for` `(``int` `i = 0; i < n; i++)``        ``m[arr[i]]++;` `    ``// no of distinct values in the array``    ``// is equal to size of map.``    ``int` `s = m.size();` `    ``// an array of pairs``    ``pair<``int``, ``int``> p[s];` `    ``// Fill (val, freq) pairs in an array``    ``// of pairs.``    ``int` `i = 0;``    ``for` `(``auto` `it = m.begin(); it != m.end(); ++it)``        ``p[i++] = make_pair(it->first, it->second);` `    ``// sort the array of pairs using above``    ``// compare function.``    ``sort(p, p + s, compare);` `    ``cout << ``"Elements sorted by frequency are: "``;``    ``for` `(``int` `i = 0; i < s; i++)``    ``{``        ``int` `freq = p[i].second;``        ``while` `(freq--)``            ``cout << p[i].first << ``" "``;``    ``}``}` `// driver program``int` `main()``{``    ``int` `arr[] = {2, 3, 2, 4, 5, 12, 2, 3,``                ``3, 3, 12};``    ``int` `n = ``sizeof``(arr)/ ``sizeof``(arr);``    ``printSorted(arr, n);``    ``return` `0;``}`

## Java

 `// Java program to sort elements by frequency using``import` `java.util.*;` `public` `class` `Main``{``  ` `    ``// function to compare two pairs for inbuilt sort``    ``static` `boolean` `compare(Map.Entry p1,``                           ``Map.Entry p2)``    ``{``        ``// If frequencies are same, compare values``        ``if` `(p1.getValue().equals(p2.getValue()))``            ``return` `p1.getKey() < p2.getKey();``        ``return` `p1.getValue() > p2.getValue();``    ``}` `    ``// function to print elements sorted by freq``    ``static` `void` `printSorted(``int``[] arr, ``int` `n)``    ``{``        ``// Store items and their frequencies``        ``Map m``            ``= ``new` `HashMap();``        ``for` `(``int` `i = ``0``; i < n; i++)``            ``m.put(arr[i], m.getOrDefault(arr[i], ``0``) + ``1``);` `        ``// no of distinct values in the array``        ``// is equal to size of map.``        ``int` `s = m.size();` `        ``// an array of Map.Entry pairs``        ``List > list``            ``= ``new` `ArrayList >(``                ``m.entrySet());` `        ``// sort the list of Map.Entry pairs using above``        ``// compare function.``        ``Collections.sort(``            ``list, (p1, p2) -> compare(p1, p2) ? -``1` `: ``1``);` `        ``System.out.print(``            ``"Elements sorted by frequency are: "``);``        ``for` `(Map.Entry entry : list) {``            ``int` `freq = entry.getValue();``            ``while` `(freq-- > ``0``)``                ``System.out.print(entry.getKey() + ``" "``);``        ``}``    ``}` `    ``// driver program``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int``[] arr = { ``2``, ``3``, ``2``, ``4``, ``5``, ``12``, ``2``, ``3``, ``3``, ``3``, ``12` `};``        ``int` `n = arr.length;``        ``printSorted(arr, n);``    ``}``}`

Output

`Elements sorted by frequency are: 3 3 3 3 2 2 2 12 12 4 5 `

Time Complexity : O(n Log n)

Space Complexity: O(n)
The above algorithm requires O(n) space for the hash map and the array of pairs.