首页 > 试题广场 >

小苯的数字排序

[编程题]小苯的数字排序
  • 热度指数:303 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1024M,其他语言2048M
  • 算法知识视频讲解
\hspace{15pt}小苯有 n 个数字 a_1, a_2, \dots, a_n,他希望将这些数字按照以下规则排序:
{\hspace{20pt}}_\texttt{1.}\,所有偶数排在所有奇数前面;
{\hspace{20pt}}_\texttt{2.}\,在规则 1 的基础上,偶数与偶数之间、奇数与奇数之间,都按照数值从小到大的顺序排列。
\hspace{15pt}请你帮他排出一个合理的顺序吧。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10^5\right) 代表数据组数,每组测试数据描述如下:
\hspace{15pt}第一行一个正整数 n\left(1 \leqq n \leqq 2 \times 10^5\right) 表示数字的个数。
\hspace{15pt}第二行 n 个正整数 a_1, a_2, \dots, a_n\left(1 \leqq a_i \leqq 10^9\right),表示小苯的 n 个数字。
\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 2 \times 10^5


输出描述:
\hspace{15pt}对于每一组测试数据,新起一行输出 n 个数字,表示按小苯的要求排好序的结果。
示例1

输入

2
5
1 2 3 4 6
3
1 1 2

输出

2 4 6 1 3
2 1 1

说明

\hspace{15pt}对于第一组测试数据,偶数集合为 \{2, 4, 6\},奇数集合为 \{1, 3\}。偶数内部升序排列为 \{2, 4, 6\},奇数内部升序排列为 \{1, 3\}。根据规则,偶数在前,奇数在后,拼接得到最终结果:\{2, 4, 6, 1, 3\}
int main() {
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for(auto & v : a) cin >> v;
        sort(a.begin(), a.end(), [](auto x, auto y) {
            if((x & 1) != (y & 1)) return (x & 1) == 0;
            return x < y;
        });
        for(auto v : a) cout << v << " ";
        cout << endl;
    }
}
发表于 2025-12-06 18:18:23 回复(0)