【概述】
基数排序是一种稳定的排序方法,属于非比较类排序,其基本思想是:将待排序序列分到有限数量的桶中,每个桶再个别排序。
简单来说,就是将数据分组,放在一个个桶中,然后对每组每个桶再进行排序。
【过程】
例如:要对大小为 [1..1000] 范围内的 n 个整数 A[1..n] 排序
首先,可以把桶设为大小为 10 的范围,具体而言,设集合 B[1] 存储 [1..10] 的整数,集合 B[2] 存储 (10..20] 的整数,……,集合 B[i] 存储 ((i-1)*10, i*10] 的整数,i=1,2,..100,总共有 100 个桶。
然后,对 A[1..n] 从头到尾扫描一遍,把每个 A[i] 放入对应的桶 B[j] 中,再对这 100 个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。
最后,依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。
【源程序】
int getDigitInPos(int num,int pos){//找到数字num的从第到高的第pos位数据
int temp=1;
for(int i=0;i<pos-1;i++)
temp*=10;
return (num/temp)%10;
}
#define RADIX 10//基数为10,需要十个桶
#define KEYNUM 10//关键字位数,这里为整形位数
void RadixSort(int a[], int n){
int *b[RADIX];//分别为0~9基数的存放空间
for (int i=0;i<10;i++){
b[i]=(int *)malloc(sizeof(int)*(dataNum + 1));
b[i][0]=0;//index为0处记录这组数据的个数
}
for(int pos=1;pos<=KEYNUM;pos++){//从个位开始入桶并出桶
for(int i=0;i<n;i++){//分配过程
int num=getDigitInPos(a[i],pos);
int index=++b[num][0];
b[num][index]=a[i];
}
for(int i=0,j=0;i<RADIX;i++){//收集
for(int k=1;k<=radixArrays[i][0];k++)
a[j++]=b[i][k];
b[i][0]=0;//出桶完毕,复位
}
}
}