分别排序奇数和偶数,再按奇数降序、偶数升序拼接输出。
OJ: noi_openjudge
题目 ID: ch0110-06
难度:入门
标签:排序分类讨论python
日期: 2026-07-30 23:01
题意
将十个整数重新排列:奇数在前且从大到小,偶数在后且从小到大。
思路
按奇偶性将数分成两个序列。奇数调用 sorted(..., reverse=True) 得到降序,偶数正常升序。最后用扩展参数 print(*odds, *evens) 按要求将两段连在一起输出。
代码
Python代码
python
numbers = list(map(int, input().split()))
odds = sorted((number for number in numbers if number % 2 == 1), reverse=True)
evens = sorted(number for number in numbers if number % 2 == 0)
print(*odds, *evens)C++代码
cpp
#include <cstdio>
int odd[100];
int odd_cnt = 0;
int eve[100];
int eve_cnt = 0;
int push(int x){
if( x % 2 == 1)
odd[++odd_cnt] = x;
else
eve[++eve_cnt] = x;
}
void init(){
int i,t;
for (i=1;i<=10;i++){
scanf("%d",&t);
push(t);
}
}
void xchg(int &a,int &b){
int t = a; a = b; b =t;
}
void quick_sort_odd(int l,int r){
if( l >= r) return ;
int key = odd[l];
int i = l,j = r;
while( i != j ){
while( i< j && key >= odd[j])
j--;
while( i <j && key <= odd[i])
i++;
if( i < j){
xchg(odd[i],odd[j]);
}
}
odd[l] = odd[i];
odd[i] = key;
quick_sort_odd(l,i-1);
quick_sort_odd(i+1,r);
}
void quick_sort_eve(int l,int r){
if( l >= r) return ;
int key = eve[l];
int i = l,j = r;
while( i != j ){
while( i< j && key <= eve[j])
j--;
while( i <j && key >= eve[i])
i++;
if( i < j){
xchg(eve[i],eve[j]);
}
}
eve[l] = eve[i];
eve[i] = key;
quick_sort_eve(l,i-1);
quick_sort_eve(i+1,r);
}
int main(){
init();
quick_sort_odd(1,odd_cnt);
quick_sort_eve(1,eve_cnt);
int i;
for (i=1;i<=odd_cnt;i++){
printf("%d ",odd[i]);
}
for (i=1;i<=eve_cnt;i++){
printf("%d ",eve[i]);
}
return 0;
}复杂度
设输入规模为
总结
先分类再分别排序,是处理“不同类别有不同顺序”的直接方法。