为什么 std::sort 不适用于我的 comp 函数?

0 c++ sorting comparison

有人可以解释为什么 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)

我试图将一个数组分成两部分:赔率和偶数,然后偶数升序排序,赔率降序排序

ein*_*ica 6

你的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()

你说你想:

  1. 将数组分成两部分:几率和偶数。
  2. 按升序对偶数进行排序。
  3. 按降序对他的赔率进行排序。

那么,为什么不这样做呢?

标准库提供了两种您可以使用的算法:std::sortstd::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)