长度为 N 的数组可以包含值 1,2,3 ... N^2。是不是可以在 O(n) 时间内排序?

Posted

技术标签:

【中文标题】长度为 N 的数组可以包含值 1,2,3 ... N^2。是不是可以在 O(n) 时间内排序?【英文标题】: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/… 【参考方案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 sort 和 N 个存储桶和两次通行证。基本上,您将数字视为以 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 sort 在O(n) 时间内对具有明确定义的最大值的任何整数数组进行排序。您遇到的任何整数列表都可能是这种情况。例如,如果您正在对任意精度整数列表进行排序,那将是不正确的。但是所有的 C 整数类型都有明确定义的固定范围。

【讨论】:

以上是关于长度为 N 的数组可以包含值 1,2,3 ... N^2。是不是可以在 O(n) 时间内排序?的主要内容,如果未能解决你的问题,请参考以下文章

2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2

2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左;arr[i] == 2,代表汉诺塔问题中,从上

2022-03-18:arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益就是累加和 = 3 + 1 + 4 +

学习笔记:javascript内置对象:数组对象

如何在raptor中创建一个长度为100的数组,数组内的元素数值为1,2,3,……,100,然后将

不修改数组找出重复的数字