Related Articles
Sorting Array Elements By Frequency | Set 3 (Using STL)
• Difficulty Level : Medium
• Last Updated : 29 May, 2018

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
```

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

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 :

 `// 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;``}`

Output:

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

Time Complexity : O(n Log n)