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

📅  最后修改于: 2023-12-03 14:54:41.559000             🧑  作者: Mango

STL - 按频率对数组元素进行排序

在数据结构相关问题中经常会出现需要按照元素频率对数组进行排序的需求,STL中的mappriority_queue可以帮助我们实现这个功能。本篇文章将介绍如何使用STL对数组进行按频率排序。

map的使用

map是STL中用于实现键值对映射的关联容器,通过map我们可以将元素和出现次数映射起来,键值为元素,值为出现次数。为了实现按频率排序,我们可以将映射后的元素和其出现次数存储在一个vector中,然后使用sort函数和一个自定义的比较函数将其排序。

以下是使用map实现按频率排序的示例代码:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

bool cmp(pair<int, int> p1, pair<int, int> p2) {
    if (p1.second != p2.second) {
        return p1.second > p2.second; // 按照出现次数从大到小排序
    } else {
        return p1.first < p2.first; // 出现次数相等时,按元素从小到大排序
    }
}

int main() {
    int arr[] = { 1, 2, 2, 3, 4, 4, 4, 5 };
    int n = sizeof(arr) / sizeof(int);

    map<int, int> mp;
    for (int i = 0; i < n; i++) {
        mp[arr[i]]++;
    }

    vector<pair<int, int>> v(mp.begin(), mp.end());
    sort(v.begin(), v.end(), cmp);

    for (auto p : v) {
        cout << p.first << " " << p.second << endl;
    }

    return 0;
}

输出结果为:

4 3
2 2
1 1
3 1
5 1
priority_queue的使用

priority_queue是STL中用于实现优先队列的容器,每次取出元素时会自动弹出优先级最高的元素。为了实现按频率排序,我们可以将元素和出现次数封装在一个结构体中,并且重载<运算符,按照出现次数从大到小排列。

以下是使用priority_queue实现按频率排序的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

struct Node {
    int val;
    int cnt;

    bool operator < (const Node &rhs) const { // 重载 < 运算符
        return cnt < rhs.cnt;
    }
};

int main() {
    int arr[] = { 1, 2, 2, 3, 4, 4, 4, 5 };
    int n = sizeof(arr) / sizeof(int);

    unordered_map<int, int> mp;
    for (int i = 0; i < n; i++) {
        mp[arr[i]]++;
    }

    priority_queue<Node> pq;
    for (auto p : mp) {
        pq.push({ p.first, p.second });
    }

    while (!pq.empty()) {
        cout << pq.top().val << " " << pq.top().cnt << endl;
        pq.pop();
    }

    return 0;
}

输出结果为:

4 3
2 2
1 1
3 1
5 1
小结

使用STL中的mappriority_queue可以很方便地实现按频率排序的功能。需要注意的是,在使用map时需要自定义比较函数,而在使用priority_queue时需要重载<运算符。