「模板」 基数排序

基数排序

大约是逐十进制位的桶排序。

分为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('\n');
	return 0;
}

谢谢阅读

posted @ 2018-01-09 15:49  Capella  阅读(149)  评论(0编辑  收藏  举报

谢谢光临