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

Algorithm 仅使用可对n个数字进行排序的函数对n^2个数字进行排序,algorithm,sorting,Algorithm,Sorting,有一个函数F()可以对任意n个数字进行排序,现在有n^2个数字需要排序,至少需要调用F()多少次?(只能调用F()。 我想出了一个类似于气泡排序的方法,大约调用了O(n^2)次。有没有更好的办法 0。您可以编写一个新函数对n^2数字进行排序,而不需要调用F()。这是作弊吗?我不这么认为。这完全取决于除了调用F()之外,您还可以做什么 您可以将n^2数字划分为n组n数字,并在每个组上调用F(),然后对n数字列表进行合并。这也是一个合理的解决方案,除非你仍然称之为作弊 如果您想进一步限制问题,可以有

有一个函数F()可以对任意n个数字进行排序,现在有n^2个数字需要排序,至少需要调用F()多少次?(只能调用F()。
我想出了一个类似于气泡排序的方法,大约调用了O(n^2)次。有没有更好的办法

0。您可以编写一个新函数对
n^2
数字进行排序,而不需要调用
F()
。这是作弊吗?我不这么认为。这完全取决于除了调用
F()
之外,您还可以做什么

您可以将
n^2
数字划分为
n
n
数字,并在每个组上调用
F()
,然后对
n
数字列表进行合并。这也是一个合理的解决方案,除非你仍然称之为作弊

如果您想进一步限制问题,可以有更具体的解决方案,但您必须明确地说明这些限制。

您需要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

等等

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

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


编辑:

如果单个n-sorter(F)可以对任意元素(不一定是连续的)进行排序怎么办?

这是一个研究层面上的问题,与此相关。另见

看看这个:

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


如果你有
n+1
数字,你会怎么做?在@Alan Tam的回答/评论之后-你可以使用其他任何东西吗?其他功能?比较?一些DS?将数字分为三部分:第一个n/2数字,下一个n/2数字,最后一个。这个问题就像比较三个数字一样如果最后一个注释是回答我的第一个,那么:a你不能在
n/2
数字上运行
F()
,b你需要合并数组的两部分。我建议把第一个<代码> N<代码>排序,把最后一个数字与中间的某个数交换,然后看差异在哪里,运行<代码>()>代码>该部分的第一个时间。不能做任何会改变数字位置的操作。第一部分不是构造性的,问题没有说明你必须使用<代码> f-(),但这显然是问题的目的。第二种是一种方法,不作弊,但你需要多少次?据我计算,这将是
(n^2)-n次。这取决于您如何合并它们。您可以调用
F()
(这是次优的),也可以选择不调用(比如使用堆)。但是,如果您想使用堆,您可以首先使用它,甚至不需要调用
F()
。这就是为什么我认为这个问题定义模糊。约束:你不能做任何其他操作来改变数字的位置。@newSolar假设数字存储在数组中
A[n^2]
F()
是改变数组的唯一方法,我会在
a
上手动运行排序算法,以计算
x
位置的每个数字的正确排序位置
p(x)
。在
n
上有一个
F()
A
上有不同的位置,我至少可以将
地板(n/2)
放置到位。所以我需要大约
2n
调用
F()
。我认为这不是您需要的。如果您想添加一个进一步的约束,即我根本无法读取数组
a
,并且我需要盲目地调用
F()
(即,相同的序列适用于任何输入
a
),那么这是一个真正的挑战。我还没有想到一个解决方案,但在调用
n^2
F()
的过程中,我认为这是不可能的。我同意。正是我所想的。谢谢你的回答,如果F()只能对连续数进行排序,那么你的解决方案是完全正确的。但如果F()可以对不连续的数字进行排序,如何解决?