嗨,欢迎来到异星球,我是小怪同志。这篇文章主要讲认识算法,请一起学习吧。
一、桶排序
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:
1.在额外空间充足的情况下,尽量增大桶的数量
2.使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
- 什么时候最快
当输入的数据可以均匀的分配到每一个桶中。
- 什么时候最慢
当输入的数据被分配到了同一个桶中。
二、代码实现
include
include#include<
vector>
使用命名空间std;
常量整数 BUCKET_NUM=10;
structListNode{explicitListNode(inti=0):mData(i),mNext(NULL){
}
ListNode*mNext;
intmData;
};
ListNodeinsert(ListNodehead,intval){
ListNode dummyNode;
ListNode*newNode=newListNode(val);
ListNodepre,curr;
虚拟节点。m下一个=头;
pre=&dummyNode;
curr=head;
而(空!=curr&&curr->mData<=val){
pre=curr;
curr=curr->mNext;
}
newNode->mNext=curr;
pre->mNext=newNode;
返回虚拟节点。mNext;
}
ListNodeMerge(ListNodehead1,ListNode*head2){
ListNode dummyNode;
ListNode*dummy=&dummyNode;
而(空!=头1&&空!=head2){
if(head1->mData<=head2->mData){
dummy->mNext=head1;
头1=头1->m下一个;
}else{
dummy->mNext=head2;
头2=头2->m下一个;
}
dummy=dummy->mNext;
}
if(NULL!=头1)假人->m下一个=头1;
如果(空!=head2)dummy->mNext=head2;
返回虚拟节点。mNext;
}
voidBucketSort(int n,intarr[]){
vector<ListNode>buckets(BUCKET_NUM,(ListNode)(0));
for(inti=0;i<n;++i){
intindex=arr[i]/BUCKET_NUM;
ListNode*head=buckets。at(index);
桶。at(index)=insert(head,arr[i]);
}
ListNode*head=buckets.在(0);
for(inti=1;i<BUCKET_NUM;++i){
head=Merge(head,buckets.在(i));
}
for(inti=0;i<n;++i){
arr[i]=head->mData;
头=头->mNext;
}
}