桶排序
桶排序应用于数组中对元素数量的排序。
主要思路:
- 记录每种元素出现的频数,需要遍历一次数组,时间复杂度为O(n)。这里使用哈希来记录,C++中使用unordered_map.并记录出现的频数的数目max_count。
- 定义一个bucket二维数组(大小为max_count + 1,bucket[i]代表出现次数为i次),根据第一步记录的unordered_map中的值,依次将unordered_map中的元素放入桶中。循环完成后,bucket[1]中存放的是原始数组中出现了1次的元素,bucket[2]中存放的是原始数组中出现了2次的元素,以此类推。
- 根据问题要求,便可以对桶中的元素进行操作。
下面以Leetcode 347 Top k Frequent Elements为例:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> counts;
int max_count = 0;
// 统计每个元素出现的频数,并记录共出现了几种频数
for(const int num : nums){
max_count = max(max_count,++counts[num]);
}
// 定义bucket
vector<vector<int>> bucket(max_count + 1);
// 将出现频数为i的元素放到第i个桶中
for(const auto & p : counts){
bucket[p.second].push_back(p.first);
}
vector<int> res;
for(int i = max_count;i > 0;i--){
if(res.size() ==k) break;
for(const int & num : bucket[i]){
res.push_back(num);
}
}
return res;
}