答案 0 :(得分:6)
你可以在12个中轻松地:
你可以比使用二分搜索更好地做到这一点,当然......将最终数字与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)算法,如冒泡排序甚至(我怀疑)快速排序。
基本上,我认为这个想法比它的价值更麻烦。五可能是硬编码最佳排序的实际限制。更大的东西 - 只需使用标准排序算法。虽然我打赌有人会回答一个实现。