基数排序!

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
  1. MAXN:表示数组a能容纳的最大整数数量
  2. MAXT:表示基数排序支持的最大数字位数,这里假设最大为8位数字
  3. BASE:表示基数排序的基数,这里使用十进制
  4. PowOfBase[MAXT]:用于存储BASE的不如次方
  5. RadixBucket[BASE][MAXN]:基数桶,用于在排序过程中临时存放不同基数位的数字
  6. RadixBucketTop[BASE]:记录每个基数桶中当前存放的数字数量

初始化PowOfBase数组

void InitPowOfBase() {
    PowOfBase[0] = 1;
    for (int i = 1; i < MAXT; i++)
        PowOfBase[i] = PowOfBase[i - 1] * BASE;
}
  1. 初始化PowOfBase数组,以便后续快速计算任意个位上的数字
  2. 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
    }
}
  1. pos0MAXT-1,依次对各个位上的数字进行排序。
  2. 使用memset重置RadixBucketTop数组。
  3. 将所有数字按当前位的基数值分配到对应的桶中。
  4. 从桶中重新收集数字到数组a中。
  5. 对于每一位的排序完成后,进入下一位继续排序。

主函数

int a[MAXN];
int main() {
    int n;
    InitPowOfBase();
    while (scanf("%d", &n) != EOF) {
        Input(n, a);
        RadixSort(n, a);
        Output(n, a);
    }
    return 0;
}
  1. 声明数组a用于存储输入的整数
  2. 调用InitPowOfBase初始化次方数组
  3. 调用Input读取n个整数
  4. 调用RadixSort对数组a进行基数排序
  5. 调用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;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值