基数排序
a
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
b
平均时间复杂度:O(d*(n+r))
c
实现:
基数排序是按组成关键字各个数位的值进行排序的,根据基数r(若关键字是十进制,则r=10)设置r个口袋(r-1),将关键字的第T位的值分配到相应的口袋中,当所有关键字分配完,则按0号到r-1号的次序进行收集,若最大关键字有d位,则重复上述过程d次,T可以从最高有效位开始,也可以从最低有效位开始。
d
C++
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
const int N=19;
const int k=3;
struct node
{
int data;struct node *next;
};
struct node *head;
void RadixSort(int k){
struct node *p,*Head[10],*Tail[10];
int i,j,a,b;
for(j=1;j<=k;j++){ //j=1,截个位,b=1;
for(i=0;i<10;i++) //j=2,截十位,b=10;
Head[i]=NULL; //j=3,截百位,b=100。
for(a=j,b=1;a>1;a--)
b*=10;
while(head!=NULL){
p=head;head=head->next;p->next=NULL;
i=p->data/b%10; //插在链尾
if(Head[i]==NULL)
Head[i]=Tail[i]=p;
else{
Tail[i]->next=p;Tail[i]=p;
}
}
i=0; //把10条链合并成1条链
while(Head[i]==NULL)
i++;
head=Head[i];
p=Tail[i];
for(i=i+1;i<10;i++)
if(Head[i]!=NULL){
p->next=Head[i];
p=Tail[i];
}
}
}
void main(){
struct node *p;
int f=10;
for(int i=1;i<k;i++)
f*=10;
head=NULL;
srand(time(NULL));
for(i=1;i<=N;i++){ //插在链首
p=new struct node;
p->data=rand()%f;
p->next=head;
head=p;
}
cout<<"*****原输入数据*****"<<endl;
p=head;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
RadixSort(k);
cout<<"*****按升序排列*****"<<endl;
p=head;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
运行