我想对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;
}
谢谢你, 艾哈迈德。
答案 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