首页 > 试题广场 >

整数奇偶排序

[编程题]整数奇偶排序
  • 热度指数:22055 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列; 2.然后输出其中的偶数,并按从小到大排列。

输入描述:
任意排序的10个整数(0~100),彼此以空格分隔。


输出描述:
可能有多组测试数据,对于每组数据,按照要求排序后输出,由空格分隔。

1. 测试数据可能有很多组,请使用while(cin>>a[0]>>a[1]>>...>>a[9])类似的做法来实现;
2. 输入数据随机,有可能相等。
示例1

输入

4 7 3 13 11 12 0 47 34 98

输出

47 13 11 7 3 0 4 12 34 98
初学者思路:分奇偶从两边向中间建立数组,在利用stdlib自带qsort各自排序,再从中间向两边输出即可
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int comp(const void *a,const void *b){
    return *(int *)a-*(int *)b;}
int main(){
    int a[10];
    int b;
    int m=0;
    int n=9;
    for(int i=0;i<10;++i)
    {
        scanf("%d ",&b);
        if(b%2==0)
            a[n--]=b;//偶数右边输入
        else
            a[m++]=b;//奇数左边输入
    }
     qsort(a,m,4,comp);//各自排序
     qsort(a+m,9-n,4,comp);//各自排序
     for(;m>0;m--)
        printf("%d ",a[m-1]);//中间往左输出奇数
     for(;n<9;n++)
        printf("%d ",a[n+1]);//中间往右边输出偶数
}

编辑于 2022-01-13 02:25:56 回复(0)
#include<bits/stdc++.h> //万能头
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
	int N=10;
	int a[N],b[N],c[N];

	while(scanf("%d",&a[0])!=EOF)
	{
	int J_N=0,O_N=0;
	for(int i=1;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	
	for(int i=0;i<10;i++)
	{
		if(a[i]%2==0)
		{
			c[O_N]=a[i];
			O_N++;

		}
		else
		{
			b[J_N]=a[i];
			J_N++;
		}	
	}
	sort(b,b+J_N);
	sort(c,c+O_N);

	for(int i=J_N-1;i>=0;i--)
	{
		printf("%d ",b[i]);
	}
	for(int i=0;i<O_N;i++)
	{
		printf("%d ",c[i]);
	}
	printf("\n");
	}
	return 0;
}

发表于 2020-09-09 13:37:44 回复(0)
#include<iostream>
(720)#include<algorithm>
using namespace std;
int a[11];
int b[11];//存放偶数
int c[11];//存放奇数
int main()
{
    while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9])
    {
        int j=0;
        int k=0;
        for(int i=0;i<10;i++)
        {
            if(a[i]%2==0){
                b[j++]=a[i];//偶数
            }else{
                c[k++]=a[i];//奇数
            }
        }
        sort(c,c+k,greater<int>());
        sort(b,b+j);
        for(int i=0;i<k;i++)
            cout<<c[i]<<" ";
        for(int i=0;i<j;i++)
            cout<<b[i]<<" ";
        cout<<endl;
    }
    return 0;
}

发表于 2020-04-29 17:27:01 回复(0)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{int a[10]={};
while (cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9])
{vector<int> odd;
vector<int> even;
	for(int i=0;i<10;i++)
	{if(a[i]%2==0){even.push_back(a[i]);}
	else{odd.push_back(a[i]);}
	 }
  sort(even.begin(),even.end());
  sort(odd.begin(),odd.end());
  for(size_t i=0;i<odd.size();i++)
    {cout<<odd[odd.size()-i-1]<<" ";
    }
  for(size_t i=0;i<even.size();i++)
    {cout<<even[i]<<" ";
    }
  
  cout<<endl;
}
	return 0;
}

发表于 2020-02-16 12:14:07 回复(0)
#include <stdio.h>
#include <stdlib.h>

int cmp(int *a,int *b)
{
    return *b-*a;
}
int main()
{
    int a[10],h,t,temp;                              //h:head; t:tail;
    while(scanf("%d",&temp)!=EOF)
    {
        h=0,t=9;
        while(h<=t)
        {
            if(!(h==0 && t==9))scanf("%d",&temp);
            if(temp%2!=0)a[h++]=temp;
            else a[t--]=temp;
        }
        qsort(a,h,4,cmp);
        qsort(a+h,10-h,4,cmp);
        for(t=0;t<h;t++)printf("%d ",a[t]);
        for(t=9;t>=h;t--)printf("%d ",a[t]);
        printf("\n");
    }
}

发表于 2020-02-11 16:26:19 回复(1)
这题也比较简单了,利用好sort函数即可,sort默认为小到大排序,所以需要自定义一个比较即可

#include<iostream>
#include<algorithm>
bool cmp(int a,int b){
    return a>b;
}
using namespace std;
int main(){
    int a[10];
    while(cin>>a[0]){
        int oddNum=0,evenNum=0;
        int odd[10],even[10];
        if(a[0]%2==0) even[evenNum++]=a[0];
        else odd[oddNum++]=a[0];
        for(int i=1;i<10;i++){
            cin>>a[i];
            if(a[i]%2==0) even[evenNum++]=a[i];
            else odd[oddNum++]=a[i];
        }
        sort(odd,odd+oddNum,cmp);
        sort(even,even+evenNum);
        for(int i=0;i<oddNum;i++){
            if(oddNum<10||i<9)
                cout<<odd[i]<<' ';
            else if(i==9) cout<<odd[i];
        }
        for(int i=0;i<evenNum;i++){
            if(i==evenNum-1) cout<<even[i];
            else cout<<even[i]<<' ';
        }
    }
}


发表于 2019-02-09 10:22:16 回复(0)
while True:
    try:
        digitList = list(map(int,input().split()))
        odd = list(filter(lambda x:x%2==1,digitList))
        even = list(filter(lambda x:x%2==0,digitList))
        odd.sort(reverse=True)
        even.sort()
        print(" ".join(map(str,odd)),end=" ")
        print(" ".join(map(str,even)))
    except Exception:
        break
编辑于 2018-10-01 20:24:57 回复(0)
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

bool cmp(int x,int y){
    return x>y?true:false;
}

int main(){
	vector<int> a(10);
    while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]){
        sort(a.begin(),a.end());
        vector<int> odd;
        vector<int> even;
        for(int i=0;i<10;i++)
            if(a[i]%2==0)
            	even.push_back(a[i]);
            else
            	odd.push_back(a[i]);
        sort(even.begin(),even.end());
        sort(odd.begin(),odd.end(),cmp);
        for(int i=0;i<odd.size();i++){
            cout<<odd[i]<<" ";
        }
        for(int i=0;i<even.size()-1;i++){
            cout<<even[i]<<" ";
        }
        if(even.size()>=1){
            cout<<even[even.size()-1]<<endl;
        }
    }
}

发表于 2016-10-26 16:54:22 回复(0)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

// 从大到小排序的比较函数
bool cmp2(int a, int b)
{
    return a > b;
}

int a[10];  // 存储数据

int main()
{
    while(cin >> a[0])
    {
        for(int i = 1; i < 10; ++i)
        {
            cin >> a[i];
        }

        // 奇数在前面,偶数在后面
        int end = 9;
        int begin = 0;
        int tmp;
        while(begin < end)
        {
            if(a[begin] % 2 == 0)
            {
                tmp = a[begin];
                a[begin] = a[end];
                a[end] = tmp;
                --end;
            }
            else
            {
                ++begin;
            }
        }

        // 确定排序位置
        for(int i = 0; i < 10; ++i)
        {
            if(a[i] % 2 == 0)
            {
                begin = i;
                break;
            }
        }

        // 奇数排序
        sort(a, a+begin, cmp2);
        // 偶数排序
        sort(a+begin, a+10);

        for(int i = 0; i < 10; ++i)
        {
            if(i != 0)
            {
                cout << " ";
            }
            cout << a[i];
        }
        cout << endl;
    }

    return 0;
}


发表于 2016-08-10 10:07:21 回复(0)
//充分发挥sort的能力嘛,cmp中就可以把所有逻辑写清楚了
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int x,int y)
{
    if(x&1 && y&1)    //如果是奇数就大到小
        return x>y;
    if(x%2==0 && y%2==0)    //好像用位运算判断偶数不好使??
        return x<y;
    if(x&1)        //奇数在前
        return true;
    else
        return false;
}

int main()
{
    int array[10];
    while(scanf("%d",&array[0])!=EOF)
    {
        for(int i = 1; i < 10; i++)
            scanf("%d",&array[i]);
        sort(array,array+10,cmp);    //sort很强的啊
        for(int i = 0; i<9; i++)
            printf("%d ",array[i]);
        printf("%d\n",array[9]);
    }//while
    return 0;
}//main

发表于 2018-02-27 22:47:53 回复(1)

压根不用思考,直接sort然后后向打印再前向打印即可。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a[10]={0};
    while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9])
    {
        sort(a,a+10);
        for(int i=9;i>=0;--i)
            if(a[i]%2==1)
                cout<<a[i]<<" ";
        for(int i=0;i<=9;++i)
            if(a[i]%2==0)
                cout<<a[i]<<" ";
        cout<<endl;
    }
}
发表于 2021-01-29 20:28:56 回复(3)

python两行代码搞定,就是这么b



while True:
    try:
        a=list(map(int,input().split()))
        print(" ".join(map(str,sorted(filter(lambda c:c%2==1,a),reverse=True)+sorted(filter(lambda c:c%2==0,a)))))
    except:
        break
发表于 2017-10-06 15:35:46 回复(3)
#include<stdio.h>//三步走1.从小到大排序2.从后到前输出奇数3.从前向后输出偶数
#define n 10
int main()
{
    int a[n],i,j,t;
    for(i=0;i<n;i++)//输入
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)//1.排序
        for(j=0;j<n-1-i;j++)
            if(a[j]>a[j+1])//从小到大
            {t=a[j];a[j]=a[j+1];a[j+1]=t;}//交换
    for(i=n-1;i>=0;i--) //2.从大到小输出奇数
        if(a[i]%2!=0)//奇数
            printf("%d ",a[i]);
    for(i=0;i<n;i++)//3.从小到大输出偶数
        if(a[i]%2==0)//偶数
            printf("%d ",a[i]);
}

编辑于 2020-04-02 18:23:33 回复(0)
发现输出的数组具有很好的对称性,哦~
先用sort排好序,再借用p、q这两个小指针,一个从前往后,一个从后往前重新放数在另一个数组中
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int main(){
    int a[10] = {0};
    int b[10] = {0};
    while (cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]) {
        int p = 0, q = 9; //两个小“指针”
        sort(a, a + 10);
        for (int i = 9; i > -1; i--) { //从后往前扫描输入的数组
            if (a[i]%2 != 0){    //如果是奇数
                b[p] = a[i]; //从前往后放
                p++;
            } else {    //如果是偶数
                b[q] = a[i];        //从后往前放
                q--;
            }
        }
        for (int j = 0; j < 10; ++j) {    //输出新数组
            printf("%d ", b[j]);
        }
        printf("\n");
    }
    return 0;
}


编辑于 2020-02-16 21:05:33 回复(2)

分类sort两次

#include<iostream>
#include<algorithm>
using namespace std;

int ji[10], ou[10];
int ji_len, ou_len;

bool cmp_s2b(int a, int b){
    return a < b;
}

bool cmp_b2s(int a, int b){
    return a > b;
}

int main(){
    int a[10];
    while(cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6] >> a[7] >> a[8] >> a[9]){
        ji_len = 0;
        ou_len = 0;
        for(int i = 0; i < 10; i++){
            if(a[i] % 2)
                ji[ji_len++] = a[i];
            else
                ou[ou_len++] = a[i];
        }
        sort(ji, ji + ji_len, cmp_b2s);
        sort(ou, ou + ou_len, cmp_s2b);
        for(int i = 0; i < ji_len; i++)
            cout << ji[i] << ' ';
        for(int i = 0; i < ou_len; i++){
            cout << ou[i];
            if(i != ou_len - 1)
                cout << ' ';
        }
    }
    return 0;
}
发表于 2019-03-14 20:11:08 回复(0)
Java 解法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            ArrayList<Integer> even = new ArrayList<>();
            ArrayList<Integer> odd = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                int n = scanner.nextInt();
                if (n%2==0) even.add(n);
                else odd.add(n);
            }
            Collections.sort(even);
            Collections.sort(odd);
            // odd 降序
            for (int i = odd.size()-1; i >=0 ; i--) System.out.print(odd.get(i)+" ");
            // even 升序
            for (Integer i : even) System.out.print(i + " ");
        }
    }
}



编辑于 2020-03-14 19:34:31 回复(0)
#include<bits/stdc++.h>
int main(){
    int n,a[101];
    memset(a,-1,sizeof(a));//memset可为int型赋值0或-1,其他值勿用
    while(scanf("%d",&n)!=EOF){
        a[n]++;
        for(int i=0;i<9;i++){
            scanf("%d",&n);
            a[n]++;
        }
        for(int i=99;i>=0;i-=2)
            if(a[i]>=0)
                for(int j=0;j<=a[i];j++)
                    printf("%d ",i);
        for(int i=0;i<=100;i+=2)
            if(a[i]>=0)
                for(int j=0;j<=a[i];j++)
                    printf("%d ",i);
        printf("\n");
    }
}//Hash的应用
编辑于 2019-03-07 09:39:33 回复(0)
两个vector分别存储,sort快排
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
    vector<int>OddArray;
    vector<int>OvenArray;
    for (int i = 0; i < 10; ++i) {
        int input;
        cin >> input;
        if (input % 2 == 1) {
            OddArray.emplace_back(
                input);//使用emplace_back避免额外的构造和拷贝开销
        } else {
            OvenArray.emplace_back(input);
        }
    }
    sort(OddArray.begin(), OddArray.end(), [](const auto & a,
    const auto & b) { //a和b是容器中元素的引用
        return a > b;
    });
    sort(OvenArray.begin(), OvenArray.end());
    for (const auto& element : OddArray) {
        cout << element << ' ';
    }
    for (const auto& element : OvenArray) {
        cout << element << ' ';
    }
    return 0;
}


发表于 2024-01-25 17:32:33 回复(0)
///    if(lhs%2==1&&rhs%2==0||lhs%2==0&&rhs%2==1) 这是及其错误的,因为当lhs为偶数,rhs为奇数时偶数和奇数必须交换,因为题目要求先输出奇数
也可以用sort 中的compare 当 lhs rhs为 奇 偶,奇大 奇小, 偶小,偶大时,必不交换, return true; 其他任意都返回 false交换,所以排序完的数组即为先奇后偶且正反序
#include <iostream>
#include <cstdio>
#include "algorithm"
using namespace std;
bool compare(int lhs,int rhs){
///    if(lhs%2==1&&rhs%2==0||lhs%2==0&&rhs%2==1)  这是及其错误的,因为当lhs为偶数,rhs为奇数时偶数和奇数必须交换,因为题目要求先输出奇数

    if(lhs%2==1&&rhs%2==0)
        return true; //不交换return true;
    else
        if(lhs%2==1&&rhs%2==1&&lhs>rhs||lhs%2==0&&rhs%2==0&&lhs<rhs)
            return true;
        else
            return false;

}

int main() {
    int str[10];
    for(int i=0;i<10;i++){
        scanf("%d",str+i);
    }
//    sort(str,str+10);
//    for(int i=9;i>=0;i--){
//        if(str[i]%2)
//            printf("%d ",str[i]);
//    }
//    for(int i=0;i<10;i++){
//        if(str[i]%2==0){
//            printf("%d ",str[i]);
//        }
//    }

///或者用compare
    sort(str,str+10,compare);
    for(int i=0;i<10;i++)
    {
        printf("%d ",str[i]);
    }

    return 0;
}

发表于 2023-02-24 23:37:43 回复(0)
#include<bits/stdc++.h>
using namespace std;

vector<int> Vector1;
vector<int> Vector2;

int main(){
    int s[10];
    for(int i=0;i<10;i++){
        cin>>s[i];
    }
    sort(s,s+10);
    for(int i=0;i<10;i++){
        if(s[i]%2==1){
            Vector1.push_back(s[i]);
        }
        else{
            Vector2.push_back(s[i]);
        }
    }
    for(int i=Vector1.size()-1;i>=0;i--){
        cout<<Vector1[i]<<" ";
    }
    for(int i=0;i<Vector2.size();i++){
        cout<<Vector2[i]<<" ";
    }
    return 0;
}
发表于 2022-10-02 16:30:40 回复(0)