基数排序
大约是逐十进制位的桶排序。
分为MSD(最高位优先) && LSD(最低位优先)。
本文代码为LSD。
推荐百度百科。
#include <cstdio>
#include <cstring>
const int MAXN=100010;
int n,a[MAXN];
int MaxBit(int *a,int radix)//求最大位数
{
int p=radix,ans=1;
for(int i=1;i<=n;++i)
while(a[i]>=p)
p*=radix,++ans;
return ans;
}
void RadixSort(int *a,int radix)
{
int p=1,size=radix<<2,b[MAXN],*cnt=new int[radix];
for(int i=1,m=MaxBit(a,radix);i<=m;++i)
{
memset(cnt,0,size);
for(int j=1;j<=n;++j)//桶中数个数
++cnt[a[j]/p%radix];
for(int j=1;j<radix;++j)//分配
cnt[j]+=cnt[j-1];
for(int j=n,t;j>=1;--j)//收集
b[cnt[a[j]/p%radix]--]=a[j];
memcpy(a,b,sizeof b);//返回
p*=radix;
}
delete []cnt;
}
int main(int argc,char *argv[])
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
RadixSort(a,10);
for(int i=1;i<=n;++i)
printf("%d ",a[i]);
putchar('
');
return 0;
}
谢谢阅读