《数据结构与算法分析:C语言描述》复习——第六章“排序”——桶排序

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 }

 

你可能感兴趣的:(数据结构与算法)