排序算法 八.基数排序

基数排序

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;
}

运行
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值