简单掌握桶排序算法及C++版的代码实现
桶排序介绍桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。
假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。
C++实现算法假设数据分布在[0,100)之间,每个桶内部用链表表示,在数据入桶的同时插入排序。然后把各个桶中的数据合并。
#include
#include
#include
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 buckets(BUCKET_NUM,(ListNode*)(0));
for(int i=0;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
head = Merge(head,buckets.at(i));
}
for(int i=0;i
arr[i] = head->mData;
head = head->mNext;
}
}
相关阅读:
支持IE8的纯css3开发的响应式设计动画菜单教程
Android实现微信自动抢红包的程序
CSS实现HTML背景图片拉伸铺满示例
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
php命令行用法入门实例教程
js报$ is not a function 的问题的解决方法
c#判断字符是否为中文的三种方法分享(正则表达式判断)
Android中SparseArray性能优化的使用方法
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Java设计模式之Strategy模式
表单元素属性readonly和disabled使用对比
13 招教你用好 Mac 的预览 app
PHP使用header()输出图片缓存实例
虚拟机linux端mysql数据库无法远程访问的解决办法