提问人:ontrack 提问时间:10/13/2019 最后编辑:dmckee --- ex-moderator kittenontrack 更新时间:11/16/2019 访问量:34
当 compare-function 可能为某些货币对返回“don't know”时进行排序
Sorting when compare-function could return "don't know" for certain pairs
问:
我想以某种方式对对象(或可能是数据的行)进行排序。主要基于 ,但此值可以为 NULL。我有第二个值,它是一个给出顺序的数字,但它可能有一个不再等于列顺序的数字。因此,它至少应该按顺序对时间进行排序。time
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;
}
但是,泛型排序调用当然会限制其比较函数调用的数量。因此,如果它比较 ids ,它将确定一个顺序并产生此结果。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
我想让我的比较功能在某些比较中说“不知道”之类的话。Namelijk 当将带有填充的行与没有填充的行进行比较时。因此,排序函数被迫进一步查看。例如,我尝试在这种情况下返回 0,但这并不能解决问题。这种机制有名字吗?有没有其他方法可以解决这个问题?time
答:
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 的规则!
可能更符合您期望的是过程算法的结果,例如:
- 先按顺序排序
- 然后让定义明确的时间向上移动,只要上面有更大的时间
这样写,第 2 阶段看起来像一个气泡排序,仅限于非 NULL 时间的索引......你可以称之为稀疏气泡排序。
无论原始顺序如何,生成的顺序始终相同,因此它不会模棱两可。
我认为这是因为阶段 1) 是一个总订单。
如果你在序列列中引入 NULL,我什至不确定你最终会得到一个不模棱两可的排序......
也许你可以称之为多阶段部分排序。
评论