//为什么不从高位到低位排序,首先输入的所有的数中的各个数的位数不一定相同,只通过对高位进行一次排序是不行的,
#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;
}
基数排序
最新推荐文章于 2020-11-24 07:05:01 发布