【问题标题】:An array of length N can contain values 1,2,3 ... N^2. Is it possible to sort in O(n) time?长度为 N 的数组可以包含值 1,2,3 ... N^2。是否可以在 O(n) 时间内排序?
【发布时间】:2010-11-21 14:52:15
【问题描述】:

给定一个长度为 N 的数组。它可以包含从 1 到 N^2(N 平方)范围内的值,包括两个值,值是整数。是否可以在 O(N) 时间内对该数组进行排序?如果可能怎么做?

编辑:这不是家庭作业。

【问题讨论】:

  • 你的价值观是整体的,我猜?你可以用整数来做
  • @CodeInChaos:是的,我在问题中添加了该信息,谢谢。
  • @danben:有人告诉我,诸如家庭作业之类的元标记已被弃用。当然,我现在找不到参考。也许版主/超级用户可以发表评论..?
  • @Bob Jarvis - 这里是 Jeff Atwood 对此问题的看法的链接:meta.stackexchange.com/questions/60422/is-homework-an-exception/…

标签: algorithm sorting radix-sort


【解决方案1】:

以 N 为底写出每个整数,即每个 x 都可以表示为 (x1, x2),其中 x = 1 + x1 + x2*N。现在您可以使用 counting sort 对其进行两次排序,一次在 x1 上,一次在 x2 上,从而得到排序后的数组。

编辑:如下所述,像这样单独对每个“数字”进行排序称为radix sort。使用计数排序对每个数字进行排序需要 O(N) 时间和 O(N) 空间(在这种特殊情况下)。由于我们准确地重复了两次,因此总运行时间为 O(N)。

【讨论】:

  • 两阶段桶排序。您首先计算一个存储桶将有多少条目,然后计算每个存储桶的起始索引(需要 O(n))。然后您也可以在 O(n) 中将条目交换到每个存储桶中。
  • 我认为世界其他地方都称其为基数排序。
  • -1 因为我认为这个答案明显不如@svick 的答案清晰。
  • 我只听说过“计数排序”这个术语,用于描述重复键将导致输出重复记录的过程。术语“桶排序”通常用于描述单遍稳定分区操作,而“基数排序”用于描述多遍分区。
  • @supercat:见Counting sort。桶排序是一种替代算法,其复杂性与计数排序相同。基数排序是一种排序算法,它通过重复应用counting sort or bucket sort 来对任意整数列表进行排序,以分别对每个数字进行排序。请注意,对于基数排序来说,计数排序和桶排序都是稳定的,这一点至关重要。所以基本上我不明白你的评论是如何相关的。
【解决方案2】:

是的,您可以使用 radix sortN 个存储桶和两次通行证。基本上,您将数字视为以 N 为基数的 2 位数字。

【讨论】:

  • 我无法理解x = 1 + x1 + x2*N 接受的答案中所说的。如果我们以 N 为基数表示数字,N^2 最多可以用 2 位 x1 和 x2 表示,那么 x = x1 * n^0 + x2 * n^1 = x1 + x2 * N 。请澄清。
【解决方案3】:

可以使用radix sortO(n) 时间内对具有明确定义的最大值的任何整数数组进行排序。您遇到的任何整数列表都可能是这种情况。例如,如果您正在对任意精度整数列表进行排序,那将是不正确的。但是所有的 C 整数类型都有明确定义的固定范围。

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2021-03-12
    相关资源
    最近更新 更多