基数排序(Radix Sorting)是一种借助多关键字排序的思想对单逻辑关键字进行关系的方法。基数排序不需要进行记录关键字间的比较。
主要分为两个过程:
(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
基数排序的特点:
稳 定 性:稳定
时间复杂度:O(kn)(k表示整形的最高位)
空间复杂度:O(10n)
举例排序过程:
对 23, 12, 15, 108, 4,5 进行基数排序
1、对个位进行排序
12,23,4,5,15,108
2、对十位进行排序
108,4,5,12,15,23
3、对百位进行排序
4,5,12,15,23, 108
代码:
#include
#include
void RadixCountSort(int *index,int *a,int len)
{
int i;
int *count=(int *)malloc(sizeof(int)*10);
for(i=0;i<10;i++)
{
count[i]=0;
}
for(i=0;iindex[i]] ++;
}
for(i=1;i<10;i++)
{
count[i]=count[i] + count[i - 1];
}
int *sort=(int *)malloc(sizeof(int)*len);
for(i=len-1;i>=0;i--)
{
count[index[i]] --;
sort[count[index[i]]] = a[i];
}
for(i=0;isort[i];
}
free(sort);
free(count);
}
void RadixSort(int *a,int len)
{
int i , x=1;
int tmp=1;
int *radix=(int *)malloc(sizeof(int)*len);
while(x)
{
tmp=tmp * 10;
x=0;
for(i=0;i10);
if(a[i] / tmp > 0)
{
x = 1;
}
}
RadixCountSort(radix,a,len);
}
free(radix);
}
int main()
{
int i,len;
int a[]={100, 8 , 1099, 6, 1, 300, 405, 604, 102, 806, 706, 504};
len =sizeof(a) / sizeof(int);
RadixSort(a,len);
for(i=0;iprintf("%d ",a[i]);
}
printf("\n");
return 0;
}