/*
* sort.c
*
* Created on: Feb 15, 2016
* Author: wing
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct num{
int n;
int d[3];
};
int digitsort(struct num *x,int j,int n,struct num *result)
{
int i,*c;
c=(int *)malloc(sizeof(int)*n);
memset(c,0,sizeof(int)*n);
for (i=0;i<n;i++)
c[x[i].d[j]]++;
for (i=1;i<n;i++)
c[i]+=c[i-1];
for (i=n-1;i>=0;i--)
{
result[c[x[i].d[j]]-1]=x[i];
c[x[i].d[j]]--;
}
return 0;
}
int main(void)
{
struct num *x,*result,*p;
int n,i,tmp,j;
scanf("%d",&n);
x=(struct num*)malloc(sizeof(struct num)*n);
for (i=0;i<n;i++)
{
scanf("%d",&(x[i].n));
tmp=x[i].n;
for (j=2;j>=0;j--)
{
x[i].d[j]=tmp%n;
tmp/=n;
}
}
result=(struct num*)malloc(sizeof(struct num)*n);
for (j=2;j>=0;j--)
{
digitsort(x,j,n,result);
p=x;
x=result;
result=p;
}
for (i=0;i<n;i++)
printf("%d ",x[i].n);
return 0;
}
为什么会是O(n)呢,这意味着每个数的位数不超过一个常数,因此考虑将每个数转换为n进制,刚好每个数最多有三位^-^