https://articles.zsxq.com/id_flaketn5n3uo.html
算法描述
定义常量和全局变量
const int MAXN = 100005; // 1
const int MAXT = 8; // 2
const int BASE = 10; // 3
int PowOfBase[MAXT]; // 4
int RadixBucket[BASE][MAXN]; // 5
int RadixBucketTop[BASE]; // 6
MAXN
:表示数组a能容纳的最大整数数量MAXT
:表示基数排序支持的最大数字位数,这里假设最大为8位数字BASE
:表示基数排序的基数,这里使用十进制PowOfBase[MAXT]
:用于存储BASE的不如次方RadixBucket[BASE][MAXN]
:基数桶,用于在排序过程中临时存放不同基数位的数字RadixBucketTop[BASE]
:记录每个基数桶中当前存放的数字数量
初始化PowOfBase数组
void InitPowOfBase() {
PowOfBase[0] = 1;
for (int i = 1; i < MAXT; i++)
PowOfBase[i] = PowOfBase[i - 1] * BASE;
}
- 初始化
PowOfBase
数组,以便后续快速计算任意个位上的数字 PowOfBase[I]
存储BASE
的第i
次方
输入函数和输出函数
void Input(int n, int *a) {
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
}
void Output(int n, int *a) {
for (int i = 0; i < n; i++) {
if (i)
printf(" ");
printf("%d", a[i]);
}
puts("");
}
不多赘述
获取某一位的基数值
int getRadix(int value, int pos) {
return value / PowOfBase[pos] % BASE;
}
返回整数value
在第pos
位上的基数值。例如,对于345,若pos为1,则返回4。
基数排序函数
void RadixSort(int n, int *a) {
int i, j, top = 0, pos = 0;
while (pos < MAXT) { // 1
memset(RadixBucketTop, 0, sizeof(RadixBucketTop)); // 2
for (i = 0; i < n; i++) {
int rdx = getRadix(a[i], pos);
RadixBucket[rdx][RadixBucketTop[rdx]++] = a[i]; // 3
}
top = 0;
for (i = 0; i < BASE; i++) {
for (j = 0; j < RadixBucketTop[i]; j++)
a[top++] = RadixBucket[i][j]; // 4
}
pos++; // 5
}
}
pos
从0
到MAXT-1
,依次对各个位上的数字进行排序。- 使用
memset
重置RadixBucketTop
数组。 - 将所有数字按当前位的基数值分配到对应的桶中。
- 从桶中重新收集数字到数组
a
中。 - 对于每一位的排序完成后,进入下一位继续排序。
主函数
int a[MAXN];
int main() {
int n;
InitPowOfBase();
while (scanf("%d", &n) != EOF) {
Input(n, a);
RadixSort(n, a);
Output(n, a);
}
return 0;
}
- 声明数组
a
用于存储输入的整数 - 调用
InitPowOfBase
初始化次方数组 - 调用
Input
读取n
个整数 - 调用
RadixSort
对数组a
进行基数排序 - 调用
Output
输出排序后的数组
完整代码
#include <stdio.h>
#include <string.h>
const int MAXN = 100005;
const int MAXT = 8;
const int BASE = 10;
int PowOfBase[MAXT];
int RadixBucket[BASE][MAXN];
int RadixBucketTop[BASE];
void InitPowOfBase()
{
PowOfBase[0] = 1;
for (int i = 1; i < MAXT; i++)
PowOfBase[i] = PowOfBase[i - 1] * BASE;
}
void Input(int n, int *a)
{
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
}
void Output(int n, int *a)
{
for (int i = 0; i < n; i++)
{
if (i)
printf(" ");
printf("%d", a[i]);
}
puts("");
}
int getRadix(int value, int pos)
{
return value / PowOfBase[pos] % BASE;
}
void RadixSort(int n, int *a)
{
int i, j, top = 0, pos = 0;
while (pos < MAXT)
{
memset(RadixBucketTop, 0, sizeof(RadixBucketTop));
for (i = 0; i < n; i++)
{
int rdx = getRadix(a[i], pos);
RadixBucket[rdx][RadixBucketTop[rdx]++] = a[i];
}
top = 0;
for (i = 0; i < BASE; i++)
{
for (j = 0; j < RadixBucketTop[i]; j++)
a[top++] = RadixBucket[i][j];
}
pos++;
}
}
int a[MAXN];
int main()
{
int n;
InitPowOfBase();
while (scanf("%d", &n) != EOF)
{
Input(n, a);
RadixSort(n, a);
Output(n, a);
}
return 0;
}