【问题标题】:sort even numbers ascending then odd numbers descending偶数先升序,奇数降序
【发布时间】:2017-02-05 18:27:52
【问题描述】:

我必须使用 std::sort() 对数组中的数字进行排序,如下所示:

偶数升序,奇数降序

目前为止:

#include <algorithm>
#include <iostream>                                 
#include <vector>                                       

using namespace std;


bool order(int a, int b)                                    
{
    if (a % 2 == 0)
    {
        return a < b;
    }
    else if(a % 2 != 0)
    {
        return b < a;
    }
}
int main()                                              
{
    std::vector<int> v = { 2, 3, 5, 6, 4, 1 };          
    std::sort(v.begin(), v.end(), order);               

}

但我不知道这样做的正确顺序算法

【问题讨论】:

  • 你似乎几乎明白了。您指定不同奇数会发生什么,以及两个奇数会发生什么。你只是错过了两个偶数的规则。
  • @CygnusX1:实际上他的函数根本没有考虑b的奇偶性。
  • 您的订单可以有多种不同的解释方式。当输入为{ 2, 3, 5, 6, 4, 1 } 时,预期的输出是什么?您希望所有个偶数出现在所有个奇数之前?也就是分区,然后分别在两个分区上排序?
  • 所有偶数升序,然后所有奇数降序

标签: c++ sorting


【解决方案1】:
if (a % 2 == b % 2) { // same parity
    if (a % 2) { // odd descending
         return b < a; 
     } else { // even ascending
         return a < b;
     }
} else { // odd is bigger than even
    return b % 2;
}

【讨论】:

  • 这适用于std::sort 吗?你怎么证明呢?
  • 为什么我不需要 b % 2 != 0 ?还是 % 2 == 0?
  • 我能打印出结果来检查吗?
  • @Nawaz 是的,它是有效的。为了证明它,你会证明它是不自反的和传递的。
  • @mistergreen 在包括 C++ 在内的许多语言中,非零为真,零为假。此代码块是 order 函数的主体。
【解决方案2】:

使用标准:

std::vector<int> v {2, 3, 5, 6, 4, 1};
auto it = std::partition(v.begin(), v.end(), [](int e) { return e % 2 == 0; });

std::sort(v.begin(), it);
std::sort(it, v.end(), std::greater<>{});

// `v` would be now { 2, 4, 6, 5, 3, 1}.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2019-09-08
    • 1970-01-01
    • 2022-01-05
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多