我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

Posted

技术标签:

【中文标题】我应该在基数排序中使用哪个基数?以及如何在基数之间转换?【英文标题】:Which base should I use in radix sort? And how do I convert between bases? 【发布时间】:2014-12-02 20:47:05 【问题描述】:

如果我必须对以 10 为底的整数列表进行排序,首先我将这些整数转换为例如以 2 为底的整数,然后执行基数排序,最后将整数转换回以 10 为底的整数?

一般来说,如何使用不同于列表中整数基数的基数执行基数排序?

【问题讨论】:

假设您将数字内部存储在数字数据类型的数组中(而不是在数字字符串数组中),则不可能进行基本转换 - 您将获得该类型使用的任何基本 (可能2)。您可以使用整数除法和模运算符来选择基数 b "digits" 进行基数排序。 【参考方案1】:

一般来说,这取决于输入的表示方式。

如果您的输入表示为固定宽度的整数值,那么使用除法和 mod 在基数之间进行转换很容易。例如,您可以通过计算 n % b 获得数字 n 的最后一个 base-b 数字,并可以通过计算 n / b(向下舍入)删除该数字。

如果您的输入表示为字符串,那么在其他基础中重新解释字符就更难了。在不使用花哨的算法技术的情况下,您通常可以切换到作为基数的基数,通过将数字块视为单个数字来表示数字。您还可以使用较小的基数,例如,取每个数字,以较小的基数单独重写这些数字,然后使用一次少于一个数字的基数排序。

如果您对使用真正重量级的理论技术感兴趣,this paper demonstrates a way to encode numbers in any base in binary in a way that allows for constant-time random access of the digits with no loss in space。这肯定比其他方法先进得多,并且常数因素可能会使这种方法在实践中效率低下,但它表明理论上可以使用您喜欢的任何基础。

【讨论】:

以上是关于我应该在基数排序中使用哪个基数?以及如何在基数之间转换?的主要内容,如果未能解决你的问题,请参考以下文章

基数排序基数 16(十六进制)

基数排序是不是用于后缀排序?

基数排序时如何使字符串粘在一起?

基数排序数字比较

C中基数排序的不同基础

常用排序算法基数排序桶排序以及计数排序