Fork me on GitHub

数据结构与算法——十个排序算法之九 · 桶排序

1.桶排序说明

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

  1. 在额外空间充足的情况下,尽量增大桶的数量
  2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

最快的时候:当输入的数据可以均匀的分配到每一个桶中。

最慢的时候:当输入的数据被分配到了同一个桶中。

 

2. 示意图

元素分布在桶中:

 

然后,元素在每个桶中排序:

 

 

 

 3.代码实现

 1 #include<iterator>
 2 #include<iostream>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 const int BUCKET_NUM = 10;
 8 
 9 struct ListNode
10 {
11     explicit ListNode(int i=0):mData(i),mNext(NULL){}
12     ListNode* mNext;
13     int mData;
14 };
15 
16 ListNode* insert(ListNode* head,int val)
17 {
18     ListNode dummyNode;
19     ListNode *newNode = new ListNode(val);
20     ListNode *pre,*curr;
21     dummyNode.mNext = head;
22     pre = &dummyNode;
23     curr = head;
24     
25     while(NULL!=curr && curr->mData<=val)
26     {
27         pre = curr;
28         curr = curr->mNext;
29     }
30     
31     newNode->mNext = curr;
32     pre->mNext = newNode;
33     
34     return dummyNode.mNext;
35 }
36 
37 
38 ListNode* Merge(ListNode *head1,ListNode *head2)
39 {
40     ListNode dummyNode;
41     ListNode *dummy = &dummyNode;
42     while(NULL!=head1 && NULL!=head2)
43     {
44         if(head1->mData <= head2->mData)
45         {
46             dummy->mNext = head1;
47             head1 = head1->mNext;
48         }
49         else
50         {
51             dummy->mNext = head2;
52             head2 = head2->mNext;
53         }
54         dummy = dummy->mNext;
55     }
56     
57     if(NULL!=head1) dummy->mNext = head1;
58     if(NULL!=head2) dummy->mNext = head2;
59    
60     return dummyNode.mNext;
61 }
62 
63 void BucketSort(int n,int arr[])
64 {
65     vector<ListNode*> buckets(BUCKET_NUM,(ListNode*)(0));
66     for(int i=0;i<n;++i)
67     {
68         int index = arr[i]/BUCKET_NUM;
69         ListNode *head = buckets.at(index);
70         buckets.at(index) = insert(head,arr[i]);
71     }
72     ListNode *head = buckets.at(0);
73     for(int i=1;i<BUCKET_NUM;++i)
74     {
75         head = Merge(head,buckets.at(i));
76     }
77     for(int i=0;i<n;++i)
78     {
79         arr[i] = head->mData;
80         head = head->mNext;
81     }
82 }

 

 

 

 

 

 

====================================================================================================================

posted @ 2020-12-12 16:46  索智源  阅读(174)  评论(0)    收藏  举报