C中基数排序的不同基础

Posted

技术标签:

【中文标题】C中基数排序的不同基础【英文标题】:Different bases for radix sort in C 【发布时间】:2014-04-17 15:32:00 【问题描述】:

我很难理解基数排序。我在实现代码以使用 2 或 10 的基数时没有问题。但是,我有一个需要命令行参数来指定基数的分配。基数可以是 2 - 100,000 之间的任何值。我花了大约 10 个小时试图理解这个问题。我不要求直接回答,因为这是家庭作业。但是,如果有人可以对此有所了解,请这样做。

有些东西我不明白。基数为 100,000 有什么意义?那怎么行。我知道字母表中的每个字母或每个数字 1-9 都有一个基数。我似乎无法理解这个概念。

如果我不够具体,我很抱歉。

【问题讨论】:

您可以将任何基数表示为数字数组...例如基数为 10 的 255 = 5,5,2 或基数 2,1,1,1,1,1, 1,1,1 对于任何高于 255 的基数 255 好的,谢谢。例如,我如何以 177 为基数表示 255? 很难回答,因为我们的编号系统中没有 177 位数字 这就是我遇到的麻烦。 也许你需要停止思考文本表示的方式——比如“我能想出多少个唯一的数字符号”——想想一个数字可以用任何基数表示的事实@987654321 @作为总和d0 * b^0 + d1 + b^1 + d2 * b^2 ....。在这种情况下,您的 255 基数 177 变为 78, 1,因为 255 = 78 * 177^0 + 1 * 177^1。您只需要找到多项式的系数... 【参考方案1】:

任何基础 B 中的数字 N 只是 [0, B-1] 范围内的一系列数字。由于我们没有足够的符号来表示“正常”人类书写系统中的所有数字,所以不要考虑它是如何写成字符的。您只需要知道数字是单独存储/写入的

例如以 177 为基数的 255 是一个两位数,其中第一个数字的值为 1,第二个数字的值为 78,因为 25510 = 1×1771 sup> + 78×1770。如果某些文化使用这个基数,他们将有 177 个不同的数字符号,并且他们只用 2 个数字写出来。由于我们只有 10 个符号,我们需要定义一些符号来分隔数字,通常是 :。正如您从 Wolfram Alpha 中看到的,25510 = 1:78177

请注意,并非所有人都以 10 为基数。存在cultures that count in base 4, 5, 6, 8, 12, 15, 16, 20, 24, 27, 32, 36, 60...所以他们的符号数量会比我们大多数人多或少。然而,在非十进制基数中,目前最常用的只有 20、12 和 60 基数。

以 100000 为底,它是相同的。 1234567890987654321 将是一个 4 位数字,按顺序写为符号,值 1234、56789、9876、54321

【讨论】:

嗯...以 100,000 为基数,每个数字将 【参考方案2】:

我正要在评论中解释它,但基本上你说的是我们有时称之为“模数运算”的东西。每个数字是 0...n-1 并表示乘以 nk,其中 k 是位置。十进制的 255 是 5×100 + 5×101 + 2×102

因此,您的 255 基数 177 很难表示,但在 177 的位置有一个 1 (177×101),在 1 的位置有一个 78 (177×100 sup>) 地点。

作为一个通用的伪代码算法,你想要...

n = input value
digits = []
while n > 1
    quotient = n / base (as an integer)
    digits += quotient
    remainder = n - quotient * base
    n = remainder

您可能需要检查最后的余数,以防出现问题。

当然,您如何表示这些数字是另一回事。例如,MIME 包含通过 Base-64 处理的半标准方式。

如果是我,我只会对数字进行定界并明确表示这是表示,但如果你想搞乱类似十六进制的扩展名,那就是 Unicode……

【讨论】:

以上是关于C中基数排序的不同基础的主要内容,如果未能解决你的问题,请参考以下文章

三种线性排序算法:计数排序桶排序与基数排序

#yyds干货盘点#十大经典排序之:基数排序 |计数排序

使用 OpenMP 并行化 C 中的基数排序

计数排序和基数排序的实现

常见排序算法导读(10)[基数排序]

基础排序算法之基数排序