基数排序

本文介绍了基数排序的原理,并提供了C++实现的详细代码。通过不断按位排序,最终得到完全有序的序列。基数排序适用于处理位数相同的整数,且效率较高,不使用比较操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//为什么不从高位到低位排序,首先输入的所有的数中的各个数的位数不一定相同,只通过对高位进行一次排序是不行的,
#include <iostream>
using namespace std;
const int base=10;//
struct wx
{
        int num;
        wx *next;
        wx()
        {
                next=NULL;
        }
};
 
wx *headn,*curn,*box[base],*curbox[base];
 
void basesort(int t)
{
        int i,k=1,r,bn;
        for(i=1;i<=t;i++)
        {
                k*=base;
        }
        r=k*base;
        for(i=0;i<base;i++)
        {
                curbox[i]=box[i];//两者指向同一空间
        }
        for(curn=headn->next;curn!=NULL;curn=curn->next)//每一轮都将按第i位排好序
        {
                bn=(curn->num%r)/k;
                curbox[bn]->next=curn;
                curbox[bn]=curbox[bn]->next;
        }
        curn=headn;
        for(i=0;i<base;i++)//再把经过第i次排序后的个队列链接起来,形成按最低位排序的一个新的单链表
        {
                if(curbox[i]!=box[i])
                {
                        curn->next=box[i]->next;//先连接到第一个元素上,然后从box[i]的链队列的最后一个元素开始,在链接box[i+1].
                        curn=curbox[i];
                }
        }
        curn->next=NULL;
}
 
void printwx()//输出最终排好序的元素
{
        for(curn=headn->next;curn!=NULL;curn=curn->next)
        {
                cout<<curn->num<<' ';
        }
        cout<<endl;
}
int max(int x,int y)//求出最大值
{
return(x>y?x:y);
}
 
int main()
{
        int i,n,z=0,maxn=0;
        curn=headn=new wx;
cout<<"Please input the numbers of the data: ";
        cin>>n;//输入待排序的元素个数
cout<<endl;
        for(i=0;i<base;i++)
        {
                curbox[i]=box[i]=new wx;//为当前的盒子以及最终存储元素的盒子分配空间
        }
cout<<"Please input the numbers which will be sorted:"<<endl;
        for(i=1;i<=n;i++)
        {
                curn=curn->next=new wx;
                cin>>curn->num;//输入要进行排序的数据
                maxn=max(maxn,curn->num);//返回当前的所有数据中的最大值
        }
        while(maxn/base>0)//求得最大数的位数,也就是所有数中最大的数所占的位数
        {
                maxn/=base;
                z++;
        }
        for(i=0;i<=z;i++)
        {
                basesort(i);
        }
        printwx();
        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值