【问题标题】:Sort algorithm for "weak order"?“弱顺序”的排序算法?
【发布时间】:2017-04-26 11:10:18
【问题描述】:

我在向量中有无序元素。没有传递性;如果元素 A > B 和 B > C,则 A > C 不需要为真。

我需要对它们进行排序,以使一个元素大于其下一个元素。

例如,如果我们有三个元素 A、B 和 C,并且:

A<B, A>C
B<C, B>A
C<A, C>B

向量是&lt;A,B,C&gt;,我们需要将其排序为&lt;A,C,B&gt;

我已经使用冒泡排序和其他需要 O(n2) 时间的经典排序算法进行排序,但看起来效率不高。

有没有更高效的算法?

谢谢。

【问题讨论】:

  • 只能按顺序排序,你说的不是一个。
  • 是否有可能 A>B、B>C、C>A(与更多元素不相似)?
  • 在问题中,您声明您已经使用“冒泡排序和其他经典排序算法”解决了这个问题。但是这些算法在这里不起作用,因为您的 &lt; 关系实际上是一个任意关系,而不是任何顺序,弱或其他。该问题等价于寻找一条哈密顿路径,对于该路径不存在已知的多项式时间算法。看我的回答。
  • 这是非传递排序。不应该被否决。一个合法的问题,我在这里,因为我有同样的问题。

标签: algorithm performance sorting quadratic


【解决方案1】:

将您的数据视为一个图形,其中数组的元素 ABC 是顶点,两个顶点之间的(有向)边 xy 是比较 @987654326 @。

在您的问题的图形视图中,对元素进行排序以使每个相邻对 xy 满足 x&gt;y 的要求与找到通过顶点的哈密顿路径相同。

您的&gt; 关系没有明显的限制(例如,它不具有传递性,并且可以包含循环),因此您得到的图是任意图。因此,您将面临在任意图中找到哈密顿路径的问题,这是一个 NP 完全问题。这意味着您不会找到简单有效的解决方案。

【讨论】:

    【解决方案2】:

    你要找的是topological sorting

    【讨论】:

    • 是的;数字是节点,每个>都是有向。所以在上面的例子中,我们有ABC 节点和A-&gt;BB-&gt;C
    • 我注意到在给出的示例中,有一个循环 Ay。 (至少,据我所知,这个问题是书面的)。
    • 在什么例子中?我的回答中没有例子。
    • 问题中的例子。
    【解决方案3】:

    我最终使用了快速排序。我选择一个枢轴元素,并对元素进行排序,使我有两半:小于枢轴的元素和大于枢轴的元素。对这两部分再次递归执行快速排序。这样我平均有 O(nlog n) 复杂度时间。

    感谢cmets!

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多