对5个整数进行排序,最多7个比较


19

如何排序5个整数的列表,以便在最坏的情况下需要进行7个比较?我不在乎执行了多少其他操作。我对整数没有什么特别的了解。

我尝试了几种不同的分而治之方法,这些方法使我只能进行8次比较,例如遵循mergesort方法,或者将mergesort与使用二进制搜索来组合以找到插入位置,但是每次我得到8次结果时,都会比较最坏的情况。

现在,我只是在寻找提示,而不是解决方案。


您是否尝试过编写“比较”树?它有叶子,每个叶子对应于整数的排列。如果您不知道“比较”树的意思,您是否知道需要进行n log n比较的证明?附言,是什么让您认为这是可能的?5!=120nlogn
PAL GD

1
那么,在8位二进制补码,if(x > y)是一样的if((x - y) & 0x80)这几乎是一个比较。我想我们应该忘记这些对象是整数,并假设我们必须使用一些魔术compare(x, y)函数来比较这些对象...
KarolisJuodelė2013年

2
“查阅《计算机编程艺术》第三卷中关于最佳排序的第5.3节(恰好涵盖了这个问题)是否算作提示或解决方案?:-)
史蒂文·斯塔德尼基

3
绑定的是真的5 = 120 < 2 7 = 128。因此可能(原则上)。2cn!5!=120<27=128
vonbrand

Answers:


23

只有一种方法可以启动此过程(对于以后要进行比较的几乎所有决定,只有一种正确的选择)。这是解决方法。首先,请注意,您可以获得可能的答案来进行比较,还有5个=需要区分的120个不同排列。27=1285!=120

第一个比较很容易:您必须比较两个键,并且由于您对它们一无所知,因此所有选择都一样好。所以我们可以说你比较b,发现一个b。现在,您剩下2 6 = 64个可能的答案,还剩下60个可能的排列(因为我们已经消除了一半)。abab26=6460

接下来,我们可以比较d,也可以将c与第一次比较中使用的键之一进行比较。如果我们比较Çd,和学习ç d,那么我们有32个其余的答案和30个可能的排列。在另一方面,如果我们比较Ç一个,我们发现一个ç,我们有40个的剩余可能的排列,因为我们已经消除了1 / 3的可能的排列(那些Ç cdccdcd3230caac401/3)。我们只剩下 32个可能的答案,所以我们很不走运。cab32

所以现在我们知道我们必须比较第一和第二个按键,以及第三和第四个按键。我们可以假设我们有c ^ d。如果我们比较Ë到这四个键,通过我们在前面的步骤中使用的同样的理由,我们可能只消除1 / 3的剩余排列的,我们很幸运的了。因此,我们必须比较两个键a b c d。考虑到对称性,我们有两个选择,比较ac或比较adabcde1/3a,b,c,dacad。类似的计数参数表明我们必须比较c。我们可以假设不失一般性的是损失ç,现在我们有一个b一个ç dacacabacd

由于您要求提供提示,因此我将不讨论其余的论点。您还有四个比较。明智地使用它们。


您如何将c进行比较只能使您减少40个排列?ac
罗伯特·S·巴恩斯

1
@Robert:假设你有一个Ç。然后有两个与这些约束一致的a b c排列,a < b < ca < c < b。对于这两个排列中的每一个,可以在四个位置添加d,在五个位置添加eabaca,b,ca<b<ca<c<bde
Peter Shor 2013年

8

您可以在D.Knuth撰写的《计算机编程艺术》第三卷中找到此方法,但是策略是这样的(我假设您拥有数组):如果要提示阅读只是我回答的前两行{a,b,c,d,e}

  • 第一组数字对:(a,b),(c,d)
  • 比较对以对它们进行排序,例如:a<b,c<d
  • 比较对最小的元素,我们得到结果如a<c
  • 比较最后一个元素和最后一个比较中的较大元素(cec
    • 如果,很容易以3个剩余比较结束。完了e<c
    • 如果,则应使用知识c < e c < d{ b c d e }进行排序。 e>c{b,c,d,e}c<e,c<d
      • ,如果 d < Ë然后 Compare(d,e)d<e
        • 如果 b > d,则为 C o m a a r e b d Compare(b,d)b>d
          • 。完了Compare(b,e)
        • 如果b<d
          • 。完了Compare(b,c)
      • 如果d>e
        • 如果 b > ËCompare(b,e)b>e
          • 。完了Compare(b,d)
        • 如果b<e
          • 。完了Compare(b,c)

c进行第一次比较之后,上述所有方式最多导致三个比较。(最多7个)。 ec


您确定这是正确的吗?假设您得到以下结果:a <b,c <d,a <c,然后c <e,b <e,c <b和d <e。a <c <b <d <e和a <c <d <b <e的顺序都与它们一致。原因是从未对b和d进行隐式或显式比较。也许我在某个地方弄错了,如果是的话,请纠正我。
乔治,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.