分配类排序不需要比较关键字的大小,它通过关键字中各位的值,通过对序列进行若干次分配和收集来实现的,分配类排序是一种借助于多关键字排序的思想对单关键字排序的方法,基数排序是典型的分配类排序
基数排序
多关键字的排序方法有最高位优先法和最低位优先法,基数排序一般利用最低位优先法,从低位到高位,对各位数上的数字进行比较从而不断调整序列元素顺序,基数排序是桶排的进阶。
void RadixSort(int a[],int n)//基数排序
{
int base=1,max=a[0];
for(int i=1;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
int t[n];
while(max/base>0)
{
int bucket[10]={0};
for(int i=0;i<n;i++)
{
bucket[a[i]/base%10]++;
}
for(int i=1;i<10;i++)
{
bucket[i]+=bucket[i-1];
}
for(int i=n-1;i>=0;i--)
{
t[bucket[a[i]/base%10]-1]=a[i];
bucket[a[i]/base%10]--;
}
for(int i=0;i<n;i++)
{
a[i]=t[i];
}
base=base*10;
}
return ;
}
稳定性:稳定
时间复杂度:
平均:O(d(n+rd))
最好:O(d(n+rd))
最坏:O(d(n+rd))
空间复杂度:O(n+rd)
基数排序既可以用于链式存储结构,也可以用于顺序结构,上面的代码是对于一般的单关键字序列而言的,严格来说,基数排序的使用条件有着严格的要求,需要直到各级关键字的主次关系和各级关键字的取值范围。