按频率值对数组项进行排序

时间:2021-05-05 18:48:13

标签: arrays algorithm sorting key-value frequency

有没有好的方法或算法可以按每个项目中的频率值对数组进行排序?假设我有这个数组:
[3, 3, 3, 5, 6, 12, 5, 5, 6]。我希望输出为 [3, 5, 6, 12]。我正在考虑插入排序之类的东西,但我相信可能有更简单的方法。

2 个答案:

答案 0 :(得分:1)

好吧,您肯定需要每个元素的计数,即 O(n)。然后你可以从中创建一个唯一的列表(假设它有 m 个元素),并根据频率使用任何你喜欢的排序算法对其进行排序。它将是 O(n+mlog(m))。 例如在python中:

from collections import Counter

myList = ['a', 'b', 'b', 'a', 'b', 'c']

myCounter = Counter(myList)
myUniqueList = list(myCounter)
sorted(myUniqueList, key=lambda e: myCounter[e])

根据Paddy3118的评论编辑

答案 1 :(得分:0)

首先你数一下

std::unordered_map<int, int> dict;
for(auto &val : array)
   dict[val]++; // O(N)

然后你对它们进行排序

std::vector vec(dict.begin(), dict.end());
std::sort(vec.begin(), vec.end(), [](auto a, auto b) { return a.second > b.second }); // O(M lg M), requires C++14 to use auto
相关问题