2014.06.17 06:22
简介:
桶排序是一种非比较排序,某些情况下其最好的复杂度可以达到O(n)。虽然并不常作为排序算法使用,但桶的思想却是哈希表的关键之一。
描述:
如果我们有k个桶,编号0~k - 1。那么我们用某种依据把数组里的n个元素分配到这k个桶中去。然后把每个桶单独排序。这k个桶必须满足一个条件——第i个桶比第i + 1个桶小。这些桶必须满足了某种顺序,才能让我们通过O(n)的时间把所有元素从桶里取出来拼到一起,得到一个排好序的数组。把元素分配到一个桶里的依据,就可以看作是哈希函数。对于桶内部的排序,可以使用其他的排序算法。虽然也可以递归继续用桶排序,但这种存在明显空间开销的算法,递归下去肯定不太好的。
实现:
1 // My implementation for radix sort. 2 #include <algorithm> 3 #include <iostream> 4 #include <vector> 5 using namespace std; 6 7 void bucketSort(vector<int> &v) 8 { 9 const int BUCKET_SIZE = 1000; 10 const int BUCKET_NUM = 1000; 11 vector<int> buckets[BUCKET_NUM]; 12 13 int n, i, j, k; 14 15 n = (int)v.size(); 16 for (i = 0; i < n; ++i) { 17 buckets[v[i] / BUCKET_SIZE % BUCKET_NUM].push_back(v[i]); 18 } 19 20 k = 0; 21 for (i = 0; i < BUCKET_NUM; ++i) { 22 if (buckets[i].size() > 1) { 23 sort(buckets[i].begin(), buckets[i].end()); 24 } 25 for (j = 0; j < (int)buckets[i].size(); ++j) { 26 v[k++] = buckets[i][j]; 27 } 28 buckets[i].clear(); 29 } 30 } 31 32 int main() 33 { 34 vector<int> v; 35 int n, i; 36 37 while (cin >> n && n > 0) { 38 v.resize(n); 39 for (i = 0; i < n; ++i) { 40 cin >> v[i]; 41 } 42 bucketSort(v); 43 for (i = 0; i < n; ++i) { 44 cout << v[i] << ' '; 45 } 46 cout << endl; 47 } 48 49 return 0; 50 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)