桶排序
来源:互联网 发布:139端口 编辑:程序博客网 时间:2024/05/22 02:21
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
桶排序以下列程序进行:
- 设置一个定量的数组当作空桶子。
- 寻访序列,并且把项目一个一个放到对应的桶子去。
- 对每个不是空的桶子进行排序。
- 从不是空的桶子里把项目再放回原来的序列中。
目录
[隐藏]- 1 伪代码
- 2 C++实现算法
- 3 外部链接
- 4 参考
伪代码[编辑]
function bucket-sort(array, n) is buckets ← new array of n empty lists for i = 0 to (length(array)-1) do insert array[i] into buckets[msbits(array[i], k)] for i = 0 to n - 1 do next-sort(buckets[i]) return the concatenation of buckets[0], ..., buckets[n-1]
C++实现算法[编辑]
假设数据分布在[0,100)之间,每个桶内部用链表表示,在数据入桶的同时插入排序。 然后把各个桶中的数据合并。
#include<iterator>#include<iostream>#include<vector>using namespace std;const int BUCKET_NUM = 10; struct ListNode{explicit ListNode(int i=0):mData(i),mNext(NULL){}ListNode* mNext;int mData;}; ListNode* insert(ListNode* head,int val){ListNode dummyNode;ListNode *newNode = new ListNode(val);ListNode *pre,*curr;dummyNode.mNext = head;pre = &dummyNode;curr = head;while(NULL!=curr && curr->mData<=val){pre = curr;curr = curr->mNext;}newNode->mNext = curr;pre->mNext = newNode;return dummyNode.mNext;} ListNode* Merge(ListNode *head1,ListNode *head2){ListNode dummyNode;ListNode *dummy = &dummyNode;while(NULL!=head1 && NULL!=head2){if(head1->mData <= head2->mData){dummy->mNext = head1;head1 = head1->mNext;}else{dummy->mNext = head2;head2 = head2->mNext;}dummy = dummy->mNext;}if(NULL!=head1) dummy->mNext = head1;if(NULL!=head2) dummy->mNext = head2; return dummyNode.mNext;} void BucketSort(int n,int arr[]){vector<ListNode*> buckets(BUCKET_NUM,(ListNode*)(0));for(int i=0;i<n;++i){int index = arr[i]/BUCKET_NUM;ListNode *head = buckets.at(index);buckets.at(index) = insert(head,arr[i]);}ListNode *head = buckets.at(0);for(int i=1;i<BUCKET_NUM;++i){head = Merge(head,buckets.at(i));}for(int i=0;i<n;++i){arr[i] = head->mData;head = head->mNext;}}
转自维基百科:http://zh.wikipedia.org/wiki/%E6%A1%B6%E6%8E%92%E5%BA%8F
代码dummyNode用的有特色,情不自禁又收藏了。
0 0
- 【排序算法】桶排序
- 排序算法-桶排序
- 第一章排序----桶排序
- 排序算法-桶排序
- 最快排序--桶排序
- 【排序】桶排序
- 排序之桶排序
- 排序之桶排序
- 排序总结---桶排序
- 排序算法----桶排序
- 排序算法---桶排序
- 【排序之一】桶排序
- 排序:桶排序
- 排序详解:桶排序
- 排序算法:桶排序
- 排序—桶排序
- 排序-桶排序
- 排序算法之--桶排序/radix排序
- 高效字符串匹配之Boyer-Moore & Rabin-Karp
- 【Objective-C】03-OC对象struct类型成员变量的赋值
- GUI TextField类 tf.addActionListener(new TFActionListener());
- UML中的聚集、组成、接口和实现
- 细说业务逻辑
- 桶排序
- 序列化 NSKeyedArchiver,NSPropertyListSerialization
- Windows安全描述符SECURITY_DESCRIPTOR阅读注释
- B. Vanya and Lanterns
- 冬吃萝卜夏吃姜 冬季吃萝卜究竟好在哪?
- Transmitting Network Data Using Volley(使用Volley框架传输网络数据)
- 解决Gitlab的The remote end hung up unexpectedly错误
- 栈和堆的区别
- HDU 5131 Little Zu Chongzhi's Triangles (状压DP +2014广州现场赛)