我应该在基数排序中使用哪个基数?以及如何在基数之间转换?
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。这肯定比其他方法先进得多,并且常数因素可能会使这种方法在实践中效率低下,但它表明理论上可以使用您喜欢的任何基础。
【讨论】:
以上是关于我应该在基数排序中使用哪个基数?以及如何在基数之间转换?的主要内容,如果未能解决你的问题,请参考以下文章