比较函数对某些对可能返回“不知道”时的排序

时间:2019-10-13 10:06:51

标签: sorting language-agnostic topological-sort

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

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

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;
}

但是,通用的排序调用当然会限制其比较函数调用的数量。因此,如果它比较ID 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

对于某些比较,我想给我的比较功能说类似“不知道”的内容。将填充time的行与不填充的行进行比较时的Namelijk。因此,排序功能被迫进一步查找。例如,在这种情况下,我尝试返回0,但这不能解决问题。这种机制有名称吗?有解决此问题的其他方法吗?

1 个答案:

答案 0 :(得分: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看起来像一个冒泡排序,仅限于非空时间的索引...您可以称其为稀疏冒泡排序。

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