整数奇偶排序

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

分别排序奇数和偶数,再按奇数降序、偶数升序拼接输出。

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;
}

复杂度

设输入规模为 nn,时间复杂度为 O(nlogn)O(n \log n),空间复杂度为 O(n)O(n)

总结

先分类再分别排序,是处理“不同类别有不同顺序”的直接方法。