我想以某种方式对对象(或可能的数据行)进行排序。主要基于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/1
,5/3
和1/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,但这不能解决问题。这种机制有名称吗?有解决此问题的其他方法吗?
答案 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的规则!
程序算法的结果可能更符合您的期望,例如:
这样写,阶段2看起来像一个冒泡排序,仅限于非空时间的索引...您可以称其为稀疏冒泡排序。
无论原始顺序如何,生成的顺序始终相同,因此不会造成歧义。
我认为这是因为阶段1)是总订单。
如果您要在序列列中引入NULL,我什至不确定您是否最终会得到一个无歧义的排序...
也许您可以将其称为多阶段部分排序。