使用不完整的比较函数对列表进行排序

时间:2009-12-19 15:03:23

标签: algorithm sorting

我有一组对象,我需要生成一个排序列表,但我的比较函数不完整,并为排序算法的“想象力”留下了一些空间。

具体来说,给出如下所示的树集合:

  A      E
  |      |
  B--C   F
  |
  D

我现有的是节点{A, B, C, D, E, F}的集合,没有特定的顺序,以及测试直接父子关系的函数:

parent(A, B)
parent(A, C)
parent(B, D)
parent(E, F)

我需要把这个变成一个父母来到他们孩子面前的清单,但除此之外,这个顺序并不重要。因此,任何这些结果都是可以接受的:

A, B, C, D, E, F.

A, B, D, C, E, F.

E, F, A, B, C, D.

A, E, B, C, F, D.

这套装置很小,最多只有几打,所以我不太关心性能。我关注的是避免列表以外的临时数据结构:由于我使用的语言的限制,将这些项目组织到临时树(例如)中会很不愉快。

2 个答案:

答案 0 :(得分:4)

我相信你正在寻找topological sort算法。

以下是维基百科文章中的相关算法:

L ← Empty list that will contain the sorted nodes
S ← Set of all nodes

function visit(node n)
    if n has not been visited yet then
        mark n as visited
        for each node m with an edge from n to m do
            visit(m)
        add n to L

for each node n in S do
    visit(n)

答案 1 :(得分:4)

您可以使用这个简单的算法:

while unsorted set is not empty {
    elem = get element from unsorted set
    while elem has parent and parent is in unsorted set {
        elem = parent of elem
    }
    add elem to result list
    remove elem from unsorted set
}