Algorithm 我们如何在只有16个比较的情况下对8个元素进行合并排序?

Algorithm 我们如何在只有16个比较的情况下对8个元素进行合并排序?,algorithm,sorting,merge,Algorithm,Sorting,Merge,几天前我问了一个关于分类的问题。我发现了如何通过对8个元素进行排序来证明比较的最少次数是16,我明白了原因。但我的合并排序算法计算了17次比较,在我的例子中,它是正确的。要合并两个长度分别为x和y的排序数组,我们需要(x+y)-1个比较,因此在合并排序中我们得到17个比较。但必须有16个比较,所以。。怎样?我在哪里可以保存该比较1) 这是一张图片: 谢谢 只有当你有奇数个数字要排序时,你才能得到最小的解。你可以通过尝试所有可能的算法来证明16次比较是不够的。为此,您需要使用和“算法生成算法”

几天前我问了一个关于分类的问题。我发现了如何通过对8个元素进行排序来证明比较的最少次数是16,我明白了原因。但我的合并排序算法计算了17次比较,在我的例子中,它是正确的。要合并两个长度分别为x和y的排序数组,我们需要(x+y)-1个比较,因此在合并排序中我们得到17个比较。但必须有16个比较,所以。。怎样?我在哪里可以保存该比较1)

这是一张图片:


谢谢

只有当你有奇数个数字要排序时,你才能得到最小的解。

你可以通过尝试所有可能的算法来证明16次比较是不够的。为此,您需要使用和“算法生成算法”。

OP包含一个明确的证据,证明在少于17次比较的情况下,不可能对8个元素进行合并排序。与其他算法相比,仍然可以在16次比较中对8个元素进行排序。该算法在D.Knuth的《计算机编程的艺术》第3卷第5.3.1章中进行了描述。它被命名为“合并插入”


比较次数最少并不能使此算法成为最快的算法。例如,对于19个比较,它的性能很容易优于合并插入,因为它并行执行大多数比较。

这是您声明您已经知道“如何证明……是16”。你的证明应该能够回答这个问题。我的意思是,我希望理论上它是可能的。使用合并排序对8个元素进行排序所需的“最少”比较次数大约少于16。例如,如果您的两个4元素子阵列是
[0,1,2,3]
[4,5,6,7]
,则只需四次比较即可合并它们。在第四次比较之后,第一个子数组是空的,您可以只复制第二个子数组——不需要进行项目比较。使用基数排序或其他一些非比较排序算法,您将不再需要进行比较。如何做到这一点?这对我来说并不明显,因为在最底层你保存了一个比较。你的基地将像2-2-2-1有7个元素。因此,您不需要比较最后一对(因为它不是一对)。这是最好的答案。。对于我的问题,有一整段文字是关于“最好的最坏的情况”的,用于比较。