使用黑盒findmax子程序进行排序的运行时间

use*_*866 15 sorting algorithm

假设你有一个黑盒子程序,可以(log n)^a及时从n个元素的数组中提取max 0 <= a <= 1.您正在尝试创建一个使用此子例程的最佳排序算法.

显而易见的解决方案是调用整个阵列上的子程序,交换最大值与所述最后一个元素,然后迭代地对调用子程序A[1, n-1]通过A[1, 2].

有没有比n*(log n)^a时间更快的运行算法,或者显而易见的解决方案是否最佳?

zw3*_*324 2

我不知道确切的答案,但这里的一些结果暗示答案可能是天真的答案:

假设我们将输入分成4份(4可以用k代替);

对这 4 个部分中的每一个进行排序需要 n/4*(log(n/4)^a),合并结果需要 (n/2+n/2+n) = 2n;

n/4*(log(n/4)^a) * 4 = n(logn^a)-n/4*(log4)^a,

总时间 = n(logn^a) - n/4*(log4)^a + 2n

然而,如果 a = 1,则 rhs = n(log(n)^a); 如果 a < 1,则 rhs > n(log(n)^a)。

因此,即使从现实世界的角度而不是 Big-Oh 的角度考虑,分而治之的方法也只能在 a<1 时减慢速度,而在 a=1 时没有任何好处。

不过不知道还有没有其他的技巧。希望这至少能激发一些想法!