奇数降序在前、偶数升序在后,用自定义比较函数一次 sort 即可。
OJ: roj
题目 ID: 1181
难度:入门
标签:入门排序数组python
创建: 2026-09-29 22:28
更新: 2026-10-05 04:33
题目描述
给定一行 10 个非负整数(
输入:一行 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;
}