排序算法 八.基数排序

基数排序

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 
#include 
#include 
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;idata=rand()%f;
        p->next=head;     
        head=p;
    }
    cout<<"*****原输入数据*****"<data<<" ";
        p=p->next;
    }
    cout<data<<" ";
        p=p->next;
    }
    cout<

运行
排序算法 八.基数排序_第1张图片

你可能感兴趣的:(排序算法 八.基数排序)