stable_sort的自定义比较功能

时间:2017-11-02 05:52:37

标签: c++ stl

我想对int32_t数组进行排序,以便首先出现所有正数(包括零),然后是所有负数。输出中+ ve和-ve数的相对顺序应与输入的顺序相同。例如。

Input  : 9, 4, -2, -1, 5, 0, -5, -3, 2 <br>
Expected Output : 9, 4, 5, 0, 2, -2, -1, -5, -3

但是,我得到以下输出:

Actual output : 2 0 5 4 9 -3 -5 -1 -2 <br>

输出部分准确,+ ve然后-ve,但+ ve和-ve数列表相反。有人可以帮忙。

#include <iostream>
#include <algorithm>
using namespace std;


bool comp(int32_t lhs, int32_t rhs)
{
    if ( (lhs < 0) && (rhs >= 0) )
        return false;
    else
        return true;
}


int main()
{
    vector<int32_t> input{9, 4, -2, -1, 5, 0, -5, -3, 2};

    // sort +ve, then -ve
    stable_sort(input.begin(), input.end(), comp);
    for (int32_t i : input)
        cout << i << " ";
    cout << endl;

    return 0;
}

谢谢你, 艾哈迈德。

2 个答案:

答案 0 :(得分:5)

您的比较功能不符合严格弱序的要求。具体而言,反思性。也就是说,对于所有a

  

comp(a,a)== false

在函数中,例如,comp(0,0)将返回true。试试这个:

bool comp(int32_t lhs, int32_t rhs)
{
    if (lhs < 0)
        return false;
    return rhs < 0;
}

但实际上,您所描述的操作是一个分区。您最好使用std::stable_partition和谓词检查值是否> = 0。

auto ge_0 = [](int A) { return A >= 0; };
std::stable_parition(input.begin(), input.end(), ge_0);

答案 1 :(得分:0)

将比较器功能更改为此

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool comp(int32_t lhs, int32_t rhs) {
    if ((lhs ^ rhs) >= 0)    // same sign: don't change
        return false;
    else
        return lhs > rhs;
}

int main() {
    vector<int32_t> input{9, 4, -2, -1, 5, 0, -5, -3, 2};
    stable_sort(input.begin(), input.end(), comp);
    for (int32_t i : input)
        cout << i << " ";
    cout << endl;
    return 0;
}

Ideone DEMO