使用总位数对数字数组进行排序

时间:2014-02-05 14:09:12

标签: arrays algorithm sorting

给定一个自然数组,每个数字可以是不同的数字位数,但保证所有数字的总位数为m

例如,如果有三个数字:

2,3,1081 then m = 6.

我需要在O(m)中对数组中的数字进行排序的算法。

我尝试使用基数排序但对我没有好处。

2 个答案:

答案 0 :(得分:4)

基数排序可以在O(m)中明确地解决这个问题。从最低有效位开始进行基数排序,并迭代地向最高位移动。

每当遇到'不存在的数字'时(例如,数字'5'的第二次迭代),将其视为-1 - 因此它将是此迭代生成的数组中的第一个。

在每个'round'之后减少数组大小并'修剪'你刚刚传递的所有数字(你在这次迭代时只被视为'-1')。

这需要检查每个元素中的每个数字一次,此外 - 对于每个元素,一次将其视为-1。
这会给您O(m+n)的复杂性,自n<m以来,这就是O(m)

答案 1 :(得分:0)

通过将每个数字按其包含的位数放入存储桶中来实施存储桶排序。这样,您知道 n + 1 个数字的存储桶中的所有数字都将大于包含 n 个数字的存储桶中的所有数字。因此,您只需要对每个存储桶中的数字进行排序,然后将它们重新组合到原始列表中就可以使排序线性化。