使用非传递比较器进行排序

时间:2016-11-15 09:56:39

标签: c++ algorithm sorting

struct A { int a, b, c; };

在这里,我需要使用类似

的逻辑对A的实例进行排序
if (lhs.a == rhs.a) { return lhs.b < rhs.b; }
else { return lhs.c < rhs.c; }

冒泡是唯一的选择吗?我知道std::sort失败了。

修改

std::sort因比较逻辑不具有传递性而失败。

如果我们有k1k2k3;由于k1 < k2因为k1.a!=k2.a && k1.c < k2.c;k2 < k3而导致k2.a != k3.a && k2.c < k3.c;k1 < k3,这并不意味着k1.a == k3.a k1.b < k2.b,但我们不会# 39;不知道是否k1: a=0, b=3, c=5; k2: a=1, b=4, c=6; k3: a=0, b=2, c=7;

这是重复。我知道,使用自定义对象进行排序是微不足道的,问题与传递比较器有关。

k1 < k2 (as k1.a != k2.a so check c: k1.c < k2.c)
k2 < k3 (as k2.a != k3.a so check c: k2.c < k3.c)
k1 < k3 ? (k1.a == k3.a so check b: k1.b > k3.b)

下面:

k1 < k2 && k2 < k3

因此k1 <k3并不意味着.test2

0 个答案:

没有答案