有人可以解释为什么 main 中的最后一个排序函数不起作用而第一个排序函数正常工作。
程序构建没有错误。这是代码:
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
bool comp (int a, int b) {
if (a % 2 == 0) { return 1; }
else { return 0; }
}
int main() {
int n; cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr+n, comp);
int pos;
for (int i = 0; i < n; i++) {
if (arr[i] % 2 == 1) {
pos = i;
break;
}
}
vector<int> un_sorted;
for (int i = 0; i < n; i++)
{
un_sorted.push_back(arr[i]);
}
//7
//5 9 2 8 6 4 7
//4 6 8 2 5 9 7
sort(un_sorted.begin(), un_sorted.begin()+pos-1);
sort(un_sorted.begin()+pos, un_sorted.end(), greater<int>());
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
我试图将一个数组分成两部分:赔率和偶数,然后偶数升序排序,赔率降序排序
comp()函数有问题正如@AlanBirtles 所指出的,您的comp()函数不会对un_sorted数组元素进行排序——这是对它们进行排序所必需的。
具体来说,
comp(x,x)对于 的所有值都不是假的x;所以,从某种意义上说,一个值可以按照数组元素的正确顺序“出现在它自己之前”。comp(x,y)而comp(y,x)有时这两个真实的-所以我们可以有对每一个需要在排序顺序来之前,其他的元素。因此使用您的comp().
查看std::sort() 关于 cppreference的页面,我们读到:
comp- 比较函数对象(即满足比较要求的对象)哪个返回?true如果第一个参数小于(即排在前面)第二个参数。
并预期std::sort()不保证做给你任何有意义的事情comp()。事实上,你的程序有未定义的行为,编译器可以让程序做任何它喜欢的事情。程序可能会崩溃,可能会陷入无限循环,或者可能什么都不做。
std::partition()你说你想:
那么,为什么不这样做呢?
标准库提供了两种您可以使用的算法:std::sort和std::partition. 下面是代码的样子:
auto is_even = [](int x) { return x % 2 == 0; };
auto evens_end_and_odds_begin =
std::partition(std::begin(my_array), std::end(my_array), is_even);
std::sort(std::begin(my_array), evens_end_and_odds_begin, std::greater<int>{});
std::sort(evens_end_and_odds_begin, std::end(my_array), std::less<int>{});
Run Code Online (Sandbox Code Playgroud)