没有正确排序

时间:2013-11-18 02:15:01

标签: c++ sorting

我有一个Node

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

1 个答案:

答案 0 :(得分:1)

您似乎已经实现了与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';