📌  相关文章
📜  按频率对数组元素进行排序|设置3(使用STL)

📅  最后修改于: 2021-05-04 18:40:23             🧑  作者: Mango

给定整数数组,请根据元素的频率对数组进行排序。如果两个元素的频率相同,则按升序打印。

例子:

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)