有一个函数F()可以对任何n个数字进行排序,现在有n ^ 2个数字需要排序,至少需要多少次调用F()? (你只能调用F())。 我想出了一个像冒泡排序的方法,大概是O(n ^ 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
个号码划分为n
个n
个号码组,并在每个组中调用F()
,然后在n
个列表中进行合并n
个数字。这也是一个看似合理的解决方案,除了你可能仍称它为作弊。
如果您想进一步为问题设置约束,可以有更具体的解决方案,但您必须明确说明这些约束。