给定一个自然数组,每个数字可以是不同的数字位数,但保证所有数字的总位数为m
。
例如,如果有三个数字:
2,3,1081 then m = 6.
我需要在O(m)
中对数组中的数字进行排序的算法。
我尝试使用基数排序但对我没有好处。
答案 0 :(得分:4)
基数排序可以在O(m)
中明确地解决这个问题。从最低有效位开始进行基数排序,并迭代地向最高位移动。
每当遇到'不存在的数字'时(例如,数字'5'的第二次迭代),将其视为-1 - 因此它将是此迭代生成的数组中的第一个。
在每个'round'之后减少数组大小并'修剪'你刚刚传递的所有数字(你在这次迭代时只被视为'-1')。
这需要检查每个元素中的每个数字一次,此外 - 对于每个元素,一次将其视为-1。
这会给您O(m+n)
的复杂性,自n<m
以来,这就是O(m)
答案 1 :(得分:0)
通过将每个数字按其包含的位数放入存储桶中来实施存储桶排序。这样,您知道 n + 1 个数字的存储桶中的所有数字都将大于包含 n 个数字的存储桶中的所有数字。因此,您只需要对每个存储桶中的数字进行排序,然后将它们重新组合到原始列表中就可以使排序线性化。