用于昂贵比较的排序算法

时间:2014-05-08 04:32:33

标签: algorithm sorting

给定是n个不同对象(不是整数)的数组,其中n介于5和15之间。我有一个比较函数cmp(a, b),如果是true,否则a < bfalse,但打电话非常昂贵。我正在寻找具有以下属性的排序算法:

  • 尽可能少地调用cmp(a, b)(受以下限制)。对cmp(a, b)的呼叫无法并行或替换。费用是不可避免的,即将每次拨打cmp(a, b)称为花钱。

  • 中止算法应该给出足够好的结果(最合适的数组排序)。理想情况下,算法应尝试生成整个数组的粗略顺序,而不是一次部分排序一个子集。这可能意味着调用的总数不会像理论上那样对整个数组进行排序。

  • cmp(a, b)暗示not cmp(b, a) =&gt;数组中没有项目相等=&gt;不需要稳定性。这总是如此,除非......

  • 在极少数情况下,cmp(a, b)会违反传递性。现在我忽略了这一点,但最终我也想要处理这个问题。在短链中可以违反传递性,即x <1。 y&lt; z&lt; x,但不是更长的链。在这种情况下,x y z的最终顺序并不重要。

只需要优化对cmp()的呼叫次数;算法的复杂性,空间,速度等因素都无关紧要。

背景故事

有人问这个奇怪的问题出在哪里。好吧,尽管我在形式主义上的浅薄尝试,但问题实际上根本不是正式的。不久之后,我的一位朋友在互联网上找到了一个网页,这使得他可以将一些东西放在一个列表中,并对该列表进行比较,以便对其进行排序。他失去了那个网页,并让我帮助他。当然,我说并打破我的键盘到达this implemtation。欢迎您仔细阅读源代码,看看我是如何假装解决上述问题的。由于当这一切发生时我非常醉,所以我决定将真实的思维外包给堆栈溢出。

1 个答案:

答案 0 :(得分:0)

你最好的选择是Knuth的TAOCP Vol III的第5章。它是关于最佳排序(即最少的比较次数)。 OTOH,因为你排序的对象数量非常少,我怀疑最佳算法与冒泡排序之间会有明显的区别。所以也许你需要专注于使比较更便宜。虽然奇怪的问题......你介意给出细节吗?它出现在哪里?