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 }