给定整数数组,请根据元素的频率对数组进行排序。如果两个元素的频率相同,则按升序打印。
例子:
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
我们在以下帖子中讨论了不同的方法:
按频率对元素进行排序|套装1
按频率对元素进行排序|套装2
我们可以使用map和pair解决这个问题。最初,我们创建一个地图,使map [element] = freq。构建完地图后,我们将创建一个成对的数组。存储元素及其对应频率的一对将用于排序。我们编写了一个自定义的比较函数,该函数首先根据频率比较两个对,如果存在基于值的平局,则进行比较。
以下是其C++实现:
// C++ program to sort elements by frequency using
// STL
#include
using namespace std;
// function to compare two pairs for inbuilt sort
bool compare(pair &p1,
pair &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 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 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;
}
输出:
Elements sorted by frequency are:
3 3 3 3 2 2 2 12 12 4 5
时间复杂度:O(n Log n)