仅使用可以排序n个数字的函数对n ^ 2个数字进行排序

时间:2015-06-30 09:35:11

标签: algorithm sorting

有一个函数F()可以对任何n个数字进行排序,现在有n ^ 2个数字需要排序,至少需要多少次调用F()? (你只能调用F())。 我想出了一个像冒泡排序的方法,大概是O(n ^ 2)次调用。有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

你需要n(2n-1)步(最坏的情况)。这是一个直观的解释:

假设每个都有4个排序组(n / 2)。我们称他们为A,B,C,D。 还假设这些组中的每一个都是排序的,初始输入向量是DCBA,最终排序的向量应该是ABCD。

在每个操作中,我们可以更改2组的顺序(例如,将BA更改为AB)。

排序DCBA需要以下步骤:

DCBA - > CDAB(2步) - > CADB(1步) - > ACBD(2步) - > ABCD(1步)

总步数:6 = 4 * 3/2

现在支持您需要对FEDCBA进行排序:

FEDCBA - > EFCDAB(3个步骤) - > ECFADB(2个步骤) - > CEAFBD(3步) - > CAEBFD(2个步骤) - > ACBEDF(3个步骤) - > ABCDEF(2个步骤)

总步数:15 = 6 * 5/2

依旧......

要对x个大小(n / 2)的块进行排序,每个步骤需要x(x-1)/ 2步(每个步骤对n个连续元素进行排序)。

n²元素是2n *(n / 2)个块,因此您需要(2n)(2n-1)/ 2 = n(2n-1)个步骤。

修改

如果单个n分拣机(F)可以对任意元素进行排序(不一定是连续的)会怎样?

这导致了与sorting networks相关的研究级问题。另请参阅here

看看这个recent paper by Shi, Yan, and Wagh

  

在这项工作中,我们提出了一种推广的n路合并算法   通过使用n-sorters作为基本构建块进行奇偶合并,其中   n(≥2)是素数。基于这种合并算法,我们还提出了一个   排序算法。对于N = n ^ p个输入值,p +⌈n/2⌉×p(p-1)/ 2   需要阶段。评估分拣网络的复杂性   按n分拣机的总数。封闭形式的表达式   分拣机的数量也来自。

答案 1 :(得分:0)

零。您可以编写一个新的函数来排序n^2个数字,而不需要调用F()。这是作弊吗?我不这么认为。除了调用F()之外,它完全取决于你可以做多少额外的事情。

您可以将n^2个号码划分为nn个号码组,并在每个组中调用F(),然后在n个列表中进行合并n个数字。这也是一个看似合理的解决方案,除了你可能仍称它为作弊。

如果您想进一步为问题设置约束,可以有更具体的解决方案,但您必须明确说明这些约束。