1、LSD-最低位优先
//获取数据中最大的位数(1)a[]为存储数据的数组。(2)为数组的个数
int maxbit(int a[],int num)
{
int d =1;
int p =10;
for(int i=0;i<num;i++)
{
while(a[i] >= p)
{
p*=10;
++d;
}
}
return d;
}
/*从低位开始桶排序*/
void LSD_Radix_Sort(int a[],int num)
{
int d = maxbit(a,num); //获取最大位数
int *tmp = new int[num]; //创建临时存储数组。
int *count = new int[10]; //存放每个桶内记录的数目,0...9
int radix =1; //基数
int i,j,k;
for(i=0;i<d;i++)
{
for(j=0;j<10;j++)//初始化count,每次换位都需要要重置一次。便于记录各桶的内记录的次数
count[j] = 0;
for(j = 0;j<num;j++)
{
k = (a[j] / radix) %10;
count[k] ++;
}
for(j=1;j<10;j++)
{
count[j] += count[j-1]; //从0到9,各桶内数据所在位置
}
for(j=num-1;j >= 0;j--)//从后往前遍历,为了保证较大数据在较小数据后面
{
k = (a[j] / radix) % 10;
tmp[count[k] -1] = a[j];
count[k] --;
}
for(j=0;j<num;j++)//将临时数据赋给原数组,一次循环结束
{
a[j] = tmp[j];
}
radix *= 10; //基数扩大十倍,即往高位进一位。
}
//释放
delete[] tmp;
delete[] count;
}
2、MSD-最高位优先
/*从高位开始桶排序,(1)a[]表示数组.(2)p表示当前的起始位置(3)所需排序的数据的数目(4)d表示位数*/
void MSD_Radix_Sort(int a[],int p,int num,int d)
{
int* tmp = new int[num];
int* count = new int[10];
int* tempcount = new int[10];//存放临时的计数,为递归时各“小”桶排序准备
int i,j,k;
int radix =1;
for(i=0;i<d-1;i++) //基数放到最大,为获取高位
radix *= 10;
for(i=0;i<10;i++)
{
count[i] = 0;
tempcount[i] = 0;
}
for(i=p;i<p + num;i++)
{
k = (a[i] / radix) % 10;
count[k]++;
tempcount[k]++;
}
for(i=1;i<10;i++)
{
count[i] += count[i-1];
}
for(i=p;i<p+num;i++)//将数组按次序排好,存到tmp中
{
k = (a[i] / radix) % 10;
tmp[count[k]-1] = a[i];
count[k] --;
}
for(i=p;i<p+num;i++)
a[i] = tmp[i-p];
int v = 0;
//对每个桶内的数据在进行下一轮的排序
for(i=0;i<10;i++)
{
if(d > 1 && tempcount[i] != 0)
{
MSD_Radix_Sort(a,v,tempcount[i],d-1);
v += tempcount[i];
}
}
delete[] tmp;
delete[] count;
delete[] tempcount;
}
3、main函数:
void main()
{
int a[] = {57,68,59,52,72,28,96,33,24};
int count = sizeof(a) / sizeof(a[0]);
LSD_Radix_Sort(a,count);
//int d = maxbit(a,count);
//MSD_Radix_Sort(a,0,count,d);
for(int i=0;i<count;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}