Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 长度为N的数组可以包含值1,2,3。。。N^2。可以在O(n)时间内排序吗?_Algorithm_Sorting_Radix Sort - Fatal编程技术网

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

Algorithm 长度为N的数组可以包含值1,2,3。。。N^2。可以在O(n)时间内排序吗?,algorithm,sorting,radix-sort,Algorithm,Sorting,Radix Sort,给定一个长度为N的数组。它可以包含从1到N^2(N平方)的值,这两个值都是整数。是否可以在O(N)时间内对该数组进行排序?如果可能怎么办 编辑:这不是一个家庭作业。以N为基数写入每个整数,即每个x可以用x=1+x1+x2*N表示为(x1,x2)。现在可以对其进行两次排序,一次在x1上,一次在x2上,从而生成已排序的数组 编辑:正如下面提到的其他人一样,对每个“数字”进行单独排序(如图所示)称为a。使用计数排序对每个数字进行排序需要O(N)个时间和O(N)个空间(在这种特殊情况下)。因为我们重复了

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


编辑:这不是一个家庭作业。

以N为基数写入每个整数,即每个x可以用x=1+x1+x2*N表示为(x1,x2)。现在可以对其进行两次排序,一次在x1上,一次在x2上,从而生成已排序的数组


编辑:正如下面提到的其他人一样,对每个“数字”进行单独排序(如图所示)称为a。使用计数排序对每个数字进行排序需要O(N)个时间和O(N)个空间(在这种特殊情况下)。因为我们重复了两次,所以总运行时间为O(N)。

是的,您可以使用N个桶和两次传递。基本上,您将数字视为以N为基数的两位数字。

可以使用。对于您遇到的任何整数列表,都可能是这种情况。例如,如果您对任意精度整数的列表进行排序,则不会是真的。但是所有的C积分类型都有明确的固定范围。

我想你的值是整数?你可以用它来做integers@CodeInChaos:是的,我在问题中添加了这些信息,谢谢。@danben:我听说像家庭作业这样的元标记不受欢迎。当然,我现在找不到参考资料。也许版主/超级用户可以发表评论。@Bob Jarvis-这里有一个链接,链接到Jeff Atwood对这个问题的看法:两阶段桶排序。首先计算一个bucket将有多少个条目,然后计算每个bucket的开始索引(取O(n))。然后你也可以替换O(n)中每个bucket中的条目。我想世界上其他地方都称之为基数排序。-1因为我认为这个答案远不如@svick的答案清晰。我只听过术语“计数排序”用来描述一个过程,在这个过程中,重复的键会导致重复的记录被输出。术语“bucket sort”通常用于描述单通道稳定分区操作,“基数sort”用于描述多通道分区。@supercat:请参阅。桶排序是一种与计数排序具有相同复杂性的替代算法。基数排序是一种排序算法,通过重复应用对每个数字分别排序,对任意整数列表进行排序。请注意,基数排序的关键是计数排序和桶排序都是稳定的。所以基本上我不理解你的评论是如何相关的。我无法理解公认答案中告诉我的
x=1+x1+x2*N
。如果我们用基数表示数字,
N
N^2
可以用最大2位表示,x1和x2,然后
x=x1*N^0+x2*N^1
=
x1+x2*N
。请澄清。