Answers:
解决方法是错误的。Demuth [1; 通过2秒 [5.3.1]显示仅使用七个比较就可以对五个值进行排序,即在这种情况下,“信息理论”的下限很严格。
答案是适合的方法,而不是通用算法。这也不是很好。这是大纲:
排序前两对。
订购这两个对各自的较大元素。
称结果为 ; 我们知道和。
将插入。
将插入到步骤3的结果中。
第一步显然需要进行两次比较,第二步只有一次。最后两个步骤各进行两次比较;在这两种情况下,我们都将其插入三元素列表中(对于第4步,请注意,从中我们知道小于当前列表的最后一个元素),然后首先与中间元素进行比较。总共进行了七个比较。
由于我看不到如何编写“好的”伪代码,因此请参见此处以了解经过测试的(希望是可读的)实现。
基于比较的排序的理论下限是。也就是说,仅使用或比较对项目进行排序,至少需要以2为底的对数,因此操作。
由于和,因此使用二元决策树可以对7个比较中的5个项目进行排序。该树会准确地找出您拥有的120个排列中的哪个,然后进行排序所需的交换。
它不是漂亮的代码,也不是简短的代码,您可能应该使用代码生成方法来创建决策树并进行交换,而不是手工编码,但是它可以工作。并证明可以对5个项目进行任何可能的排列,从而证明您最多可以对7个比较中的5个项目进行排序。
我在想快速排序。您选择恰好是中间元素的元素作为枢轴。将枢轴与剩余的4个项目进行比较,得出两堆要排序的项目。这些堆中的每一个都可以按1个比较进行排序。除非我犯了一个严重的错误,否则5个项目仅在6个比较中就被完全排序了,我认为这是完成这项工作所需的绝对最少的比较。最初的问题是找到排序5个元素最少的比较。
如果可以测试算法,请在所有数字组合上对其进行测试。如果您有很多数字,请测试许多随机组合。不精确,但是比所有组合都快。
最小
a <b <c = 2
a <b <c <d = 3
a <b <c <d <e = 4
最多
3 ^ 3
4 ^ 4
5 ^ 5
插入中间使用3-6表示4个数字。
将4-5合并为4个数字。
通过Wiki进行的最小比较是4个数字等于5 :) 5等于7。您使用8还是那么多。
https://en.wikipedia.org/wiki/Comparison_sort#Number_of_comparisons_required_to_sort_a_list
如果您在比较之前就了解所有内容,则可以进行比较。我的4个数字的平均值是3.96 / 1024所有组合。