当 compare-function 可能为某些货币对返回“don't know”时进行排序

Sorting when compare-function could return "don't know" for certain pairs

提问人:ontrack 提问时间:10/13/2019 最后编辑:dmckee --- ex-moderator kittenontrack 更新时间:11/16/2019 访问量:34

问:

我想以某种方式对对象(或可能是数据的行)进行排序。主要基于 ,但此值可以为 NULL。我有第二个值,它是一个给出顺序的数字,但它可能有一个不再等于列顺序的数字。因此,它至少应该按顺序对时间进行排序。timesequencetime

假设我有一个包含以下内容的数组/数据库:

id  time   sequence
 2  11:35  46
 4  NULL   48
 5  11:40  99
 6  NULL   49
 8  11:45  51
 9  11:50  52
 7  NULL   53
 3  NULL   54
 1  11:55  55

我希望最终结果是这样的

id  time   sequence
 2  11:35  46
 4  NULL   48
 6  NULL   49
 5  11:40  99
 8  11:45  51
 9  11:50  52
 7  NULL   53
 3  NULL   54
 1  11:55  55

一个简单的比较函数看起来像这样(伪代码)

int compare(a, b)
{
    if(a->time !== null && b->time !== null)
        return (int)a->time - (int)b->time;

    return a->sequence - b->sequence;
}

但是,泛型排序调用当然会限制其比较函数调用的数量。因此,如果它比较 ids ,它将确定一个顺序并产生此结果。5/15/31/3

id  time   sequence
 2  11:35  46
 4  NULL   48
 6  NULL   49
 8  11:45  51
 9  11:50  52
 7  NULL   53
 3  NULL   54
 5  11:40  99
 1  11:55  55

我想让我的比较功能在某些比较中说“不知道”之类的话。Namelijk 当将带有填充的行与没有填充的行进行比较时。因此,排序函数被迫进一步查看。例如,我尝试在这种情况下返回 0,但这并不能解决问题。这种机制有名字吗?有没有其他方法可以解决这个问题?time

语言无关的 拓扑排序

评论

0赞 dmckee --- ex-moderator kitten 11/16/2019
如何对不完整的排序进行排序的可能重复?
0赞 dmckee --- ex-moderator kitten 11/16/2019
翻新:stackoverflow.com/questions/480640/... stackoverflow.com/q/51429309/2509

答:

1赞 aka.nice 11/16/2019 #1

显然,你不能只通过比较任何两个元素来排序,因为你没有一个总顺序。

不过,您似乎非常确定最终的顺序。

让我们再举一个例子,因为我不清楚期望:

id  time   sequence
 2  11:35  103
 5  11:40  51
 8  11:45  28
 9  11:50  50
 1  11:55  99

所有的 NULL 时间应该去哪里,为什么?

 4  NULL   48
 6  NULL   49
 7  NULL   53
 3  NULL   54

一旦我们对非 NULL 进行排序,似乎很难找到放置 NULL 的规则!
可能更符合您期望的是过程算法的结果,例如:

  1. 先按顺序排序
  2. 然后让定义明确的时间向上移动,只要上面有更大的时间

这样写,第 2 阶段看起来像一个气泡排序,仅限于非 NULL 时间的索引......你可以称之为稀疏气泡排序。

无论原始顺序如何,生成的顺序始终相同,因此它不会模棱两可。
我认为这是因为阶段 1) 是一个总订单。
如果你在序列列中引入 NULL,我什至不确定你最终会得到一个不模棱两可的排序......
也许你可以称之为多阶段部分排序。