整数奇偶排序

GitHub跳转原题关系图返回列表

奇数降序在前、偶数升序在后,用自定义比较函数一次 sort 即可。

OJ: roj

题目 ID: 1181

难度:入门

标签:入门排序数组python

创建: 2026-09-29 22:28

更新: 2026-10-05 04:33

题目描述

给定一行 10 个非负整数(0≤ai≤300000\le a_i\le30000),要求重新排序:奇数在前且按降序,偶数在后且按升序。

输入:一行 10 个整数。

输出:排序后的一行 10 个整数。

样例输入:4 7 3 13 11 12 0 47 34 98

样例输出:47 13 11 7 3 0 4 12 34 98

思路

把奇数和偶数分别排序后拼接;也可直接用比较函数一次 std::sort 完成。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 22:30
# update_at: 2026-09-29 22:30

import sys


def parity_ordered(values: list[int]) -> list[int]:
    """重排序列:奇数从大到小在前,偶数从小到大在后。"""
    values.sort()                                 # 一次升序排序同时满足两类数的排序方向
    odds = [x for x in values if x & 1][::-1]     # 奇数取升序后反转,即从大到小
    evens = [x for x in values if not x & 1]      # 偶数保持升序,直接接在奇数后面
    return odds + evens


def solve() -> None:
    values = list(map(int, sys.stdin.buffer.read().split()))  # 一行 10 个数,空白切分即可
    print(*parity_ordered(values))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-09-29 22:31
 * update_at: 2026-10-05 04:33
 */
#include <cstdio>
#include <algorithm>

typedef long long ll;

ll a[15]; // 输入的10个整数

// 按题意排序:奇数在前且降序,偶数在后且升序
bool cmp(ll x, ll y) {
    int ox = x & 1; // x 的奇偶性,1 为奇数
    int oy = y & 1; // y 的奇偶性
    if (ox != oy) return ox > oy; // 奇数排在偶数前面
    if (ox == 1) return x > y; // 同为奇数,降序
    return x < y; // 同为偶数,升序
}

int main() {
    for (int i = 0; i < 10; i++) {
        scanf("%lld", &a[i]);
    }
    std::sort(a, a + 10, cmp); // 按自定义奇偶规则排序
    for (int i = 0; i < 10; i++) {
        if (i) printf(" ");
        printf("%lld", a[i]);
    }
    printf("\n");
    return 0;
}