假设我们想要一个列表排序,的实数。假设我们得到一个黑匣子,它可以立即对实数进行排序。使用这个黑匣子,我们可以获得多少优势?
例如,是否可以仅使用调用黑盒来对数字进行排序?我发现的最佳算法是对黑盒使用调用。但是我无法进一步改进它。这是我的算法,类似于merge-sort:n
首先将列表划分为大小约为列表。然后使用调用黑盒对这些列表进行排序。最后,使用黑框合并排序列表,如下所示:√小号1,s ^2,。。。,ş √ √ √
将列表中的最小元素放入新列表,然后调用黑盒对其进行排序。在数(第一和的最小元素)将在最小数目。我们可以将其放在输出列表的第一位。
假设已从选择元素,我们将替换为排序列表的第二个最小元素,然后再次运行黑盒以计算的第二个最小成员。
我们继续进行,直到所有元素都被排序为止。此部分的黑匣子调用总数为L [ 1 ] L S s j L [ 1 ] s j S n - √
。因此,总的通话总数为。
另一方面,看起来我们应该能够使用排序所需的数字比较中的下界来获得下界:我们可以使用√来实现黑盒比较。如果我们可以通过调用来解决该问题,并在线性时间内进行合并,则可以使用比较对实数进行排序,这是不可能的。no(nlgn)
我猜想我们可以证明是调用黑盒的次数的下限,因为黑盒中使用的许多比较将被共享,因此在我们的论点中被重新叙述。
更新:正如其他帖子所建议的,也可以实现。