最近在学后缀树组,看到建议用基数排序,于是就先来做做功课
基数排序:桶子法
比如给整型数排序,从右到左按位上的数分类,0-9各为一类,分完后再收集起来,然后按更高位来分,在收集,直到最高位结束
平均时间复杂度: O(dn)(d即表示整形的最高位数)从博客点击打开链接看来
空间复杂度:O(10n)
基数排序是稳定的
给出模板,但是不能处理负数
#include<stdio.h>
int val[100];
int bucket[12][102];
int get_pos(int num,int pos)//得到数的第pos位,从右到左
{
int t=1;
for(int i=0;i<pos-1;i++)
t*=10;
return num/t%10;
}
void radixsort(int n)
{
for(int i=0;i<10;i++)
bucket[i][0]=0;
for(int p=0;p<32;p++)
{
for(int i=0;i<n;i++)
{
int v=get_pos(val[i],p);
int index=++bucket[v][0];
bucket[v][index]=val[i];
}
for(int i=0,j=0;i<10;i++)
{
for(int k=1;k<=bucket[i][0];k++)
val[j++]=bucket[i][k];
bucket[i][0]=0;
}
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&val[i]);
radixsort(n);
for(int i=0;i<n;i++)
printf("%d ",val[i]);
printf("\n");
}
return 0;
}