主要步骤: 分配、 收集,然后对每一位做计数排序即可
#include <iostream>
using namespace std;
void assign(int* arr, int len, int* count, int radix)
{
int i;
for(i=0; i<len; i++)
{
int k=(arr[i]/radix)%10; //arr[i]/radix 取个位、十位、百位
count[k]++;
}
for(i=1; i<10; i++) //计数排序
{
count[i]+=count[i-1];
}
}
void collect(int* arr, int len, int* count, int radix) // 对每一位用计数排序
{
int* tmp=new int[len];
int i;
for(i=len-1; i>=0; i--)
{
int k=(arr[i]/radix)%10;
tmp[count[k]-1]=arr[i];
count[k]--;
}
for(i=0; i<len; i++)
{
arr[i]=tmp[i];
}
delete[] tmp;
}
int getBits(int* arr, int len)
{
int bits=1;
int toCmp=10;
int i;
for(i=0; i<len; i++)
{
while(arr[i]>=toCmp)
{
toCmp*=10;
bits++;
}
}
return bits;
}
void displayArray(int* arr, int len)
{
int i;
for(i=0; i<len; i++)
printf(" %d", arr[i]);
printf("\n");
}
void rSort(int* arr, int len)
{
int count[10];
int n=getBits(arr, len); //找到数组中的最高位
int i, j, radix=1;
for(i=0; i<n; i++)
{
for(j=0; j<10; j++)
count[j]=0;
displayArray(arr, len);
assign(arr, len, count, radix);
collect(arr, len, count, radix);
radix*=10;
}
}