大鸡排~
- 算法描述
- 定义常量和全局变量
- 初始化PowOfBase数组
- 输入函数和输出函数
- 获取某一位的基数值
- 基数排序函数
- 主函数
- 完整代码
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) { // 1memset(RadixBucketTop, 0, sizeof(RadixBucketTop)); // 2for (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;
}