如果你可以在7个比较中对5个数字进行排序,那么如何在10个比较中对6个数字进行排序?

时间:2010-11-28 09:23:30

标签: arrays sorting logic

在7个比较中排序5个数字还有另一个问题:

Sorting an array with minimal number of comparisons

我的问题是在10次比较中对6个数字进行排序。

3 个答案:

答案 0 :(得分:6)

你可以在12个中轻松地

  • 使用7个比较对前5个数字进行排序
  • 将最终数字与前5个中的每一个进行比较,以确定其位置

你可以比使用二分搜索更好地做到这一点,当然......将最终数字与5的中间进行比较,然后根据比较的结果与前两个或后两个进行比较。最多应该进行10次比较。

答案 1 :(得分:3)

最快的方法(平均比较次数等于理论值)是:

c1 -→ o  | 3/10 comparisons
c2 -→ o
o -→ o

然后在比较两个更大的数字(c1和c2)之后我们有

o -→ c1

o -→ o -→ c2 | 4/10 comparisons
 ↘
   ↘o

然后我们比较" c1"到" c2"并获得两种可能的变体(首先是c1> c2,否则是第二种)

A)Worse(26/45 of all cases)  B)Better(19/45)   | 5/10 comparisons

o -→ c1 -↘                             b-↘
           ↘                               ↘
  o -→ c2 -→ o                o -→ c1-→ c2-→ c3
   ↘                           ↘  
     ↘o                          ↘a

A)在第一种情况下,我们的下一步将是" c1"到" c2"之后我们可以获得A1)如果c1> c2,否则A2)

A1)                       A2)                 | 6/10
       o↘                 c1-→ c2 -→ o -→ o
          ↘                        ↗
 o -→ c1-→ c2 -→ c3              a -→ b
  ↘
    ↘a

A1)我们排序" a"顺序{c1; c2; c3}从与c2的比较开始,然后我们得到

A1.1)                     A1.2)               | 8/10
       a↘                            a↘
          ↘                             ↘
 c1-→ c2-→ o -→ o -→ o     c1-→ c2-→ c3-→ o -→ o 

A1)然后我们只需排序" a"顺序{c1; c2}或{c1; c2; c3}从(!)A1.1和A1.2两个案例开始,与" c2"在1-2(A1)或2(A2)比较中。

A2)我们排序" a"在{c1; c2}总是从与c1的比较开始,然后我们排序" b"在一系列小于" a"从与任何元素(如果有2个),第2个(如果有3个),第2个或第3个中的任何一个(如果该序列中有4个元素)进行比较开始

B)以同样的方式我们排序" a"在序列{c1; c2; c3}中,从与c2的比较开始,之后我们排序" b"在比c2(如果有3个元素)或c2或c3(如果有4个)的比较开始的小于c3的元素序列中。这将需要3-4次比较。您也可以从" b"开始反之亦然,结果不会发生变化。

总的来说,这个算法在19/45个案例中对9个比较中的6个数字进行排序 在26/45例中的10次比较中。

理论一分钟

6!= 720,2 ^ 9 = 512,这意味着在9次比较后我们可以得到512个不同的结果,所以对于304(304是512 - 2 *(720-512))我们可以说&#34 ;这就是全部,我们肯定知道顺序",但是对于208休息,我们还需要再进行一次比较,以便将208与其他处理区分开来,并使用相同的比较结果。 304/720 = 19/45; 208 * 2/720 = 26 / 45~0.578 因此,最好的算法平均会进行9.578次比较。 还有另一种选择:在7次比较中排序5,然后在3次比较中排序第6个元素,但是因为" 5在7"最好的算法是在1/15的情况下进行6次比较," 6次在10"算法将在1/45例中进行8次比较(16/45例中9次比较,28/45例中10次比较),平均得出9.6次比较。

答案 2 :(得分:1)

我相信你可以做到比13更好,只是基于O(n log n)增长的原则。

基本方法是设计一个决策树,确定您正在处理哪种排列,但对实际值不敏感。但是,假设需要对可能的决策树进行详尽搜索以找到最佳决策树,您需要注意随着项目数量的增加,要考虑的决策树数量会迅速增加非常。虽然我没有检查过这个猜测 - 但它可能会以指数方式进行猜测 - 甚至可能比这更糟糕。

你可以通过硬编码常见排序算法的测试来做得比13更好 - 但不是O(n ^ 2)算法,如冒泡排序甚至(我怀疑)快速排序。

基本上,我认为这个想法比它的价值更麻烦。五可能是硬编码最佳排序的实际限制。更大的东西 - 只需使用标准排序算法。虽然我打赌有人会回答一个实现。