排序不正确

Not sorting properly

本文关键字:不正确 排序      更新时间:2023-10-16

我有一个类节点

class Node
{
public:
    int Number;
    char Ch;
    Node(int N, char A)
    {
        Number = N;
        Ch = A;
    }
};

我想按如下方式排序。首先按数字排序,如果数字相等,则将字符为"M"的字符放在前面。

bool Srt(Node A, Node B)
{
    if (A.Number < B.Number)
        return true;
    if (A.Number > B.Number)
        return false;
    if (A.Number == B.Number)
    {
        if (B.Ch == 'M')
        {
            return true;
        }
        return false;
    }
    return false;
}

但是,对于以下输入,这不能正常工作:

1 S
2 S
3 S
4 S
5 S
6 S
7 S
8 S
9 S
10 S
11 S
12 S
13 S
14 S
15 S
16 S
999999985 M
999999986 M
999999987 M
999999988 M
999999989 M
999999990 M
999999991 M
999999992 M
999999993 M
999999994 M
999999995 M
999999996 M
999999997 M
999999998 M
999999999 M
1000000000 M

应该再次返回列表,但相反,它返回

1 S
2 S
3 S
4 S
5 S
6 S
7 S
8 S
9 S
999999993 M
999999994 M
999999995 M
999999996 M
999999997 M
999999998 M
999999999 M
1000000000 M
10 S
11 S
12 S
13 S
14 S
15 S
16 S
999999985 M
999999986 M
999999987 M
999999988 M
999999989 M
999999990 M
999999991 M
999999992 M

看起来您已经实现了与std::sort一起使用的小于比较。

这样的比较器需要是一个严格的弱排序,这样A < B意味着!( B < A )。如果数字相等并且两者都具有字符M,则您的函数会违反此规定。试试这个:

if (A.Number < B.Number)
    return true;
if (A.Number > B.Number)
    return false;
// Now A.Number == B.Number so there is no need to check.
return B.Ch == 'M' && A.Ch != 'M';