我们如何只进行 16 次比较就对 8 个元素进行归并排序?

Posted

技术标签:

【中文标题】我们如何只进行 16 次比较就对 8 个元素进行归并排序?【英文标题】:How can we carry out merge sort of 8 elements with only 16 comparisons? 【发布时间】:2012-01-31 01:28:40 【问题描述】:

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

这是一张图片:

http://oeis.org/A001768

谢谢!

【问题讨论】:

这就是previous question 您说您已经知道“如何证明 ... 是 16”。你的证明应该能够回答这个问题。 我的意思是我希望理论上是可能的 使用合并排序对 8 个元素进行排序所需的“最少”比较次数小于 16。例如,如果您的两个 4 元素子数组是 [0, 1, 2, 3][4, 5, 6, 7],那么合并它们只需要四次比较。在第四次比较之后,第一个子数组为空,您可以复制第二个子数组——不需要进行项目比较。 使用基数排序或其他一些您不再需要比较的非比较排序算法。 【参考方案1】:

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

最少的比较次数并不能使该算法成为最快的算法。例如,Batcher odd–even mergesort 进行了 19 次比较,很容易胜过 合并插入,因为它并行执行大多数比较。

【讨论】:

非常好的答案.. 我的问题有一个完整的段落,比较次数是“最好的最坏情况”。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

怎么样?这对我来说并不明显。 因为您在最低级别保存了比较。你的基地就像 2 - 2 - 2 - 1 有 7 个元素。因此,您不需要比较最后一对(因为它不是一对)。

以上是关于我们如何只进行 16 次比较就对 8 个元素进行归并排序?的主要内容,如果未能解决你的问题,请参考以下文章

算法折半查找的相关问题

视频+图文+动画 详解插入排序(轻松易理解系列)

将两个向量<bool> 与 SSE 进行比较

对10个元素进行快速排序,在最好情况下,元素间的比较次数为( )次。

将数组8,23,4,16,77,-5,53,100中的元素按从大到小的顺序排列,最少需要交换几次?我知道答案是5次

Bash : 冒泡排序