Hello Everyone,
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
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 frequency 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 <bits/stdc++.h>
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[0]);
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)