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 }

 

 posted on 2014-06-17 06:31  zhuli19901106  阅读(335)  评论(0编辑  收藏  举报