7-237 特殊排序

输入一个整数n和n个各不相等的整数,将这些整数从小到大进行排序,要求奇数在前,偶数在后。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(1<n<100),再输入n个整数。

输出格式:

对于每组测试,在一行上输出根据要求排序后的结果,数据之间留一个空格。

输入样例:

3
5 1 2 3 4 5
3 12 4 5
6 2 4 6 8 0 1

输出样例:

1 3 5 2 4
5 4 12
1 0 2 4 6 8

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路

要求奇数排在前面,偶数排在后面,同为奇数或偶数时按照大小排序。因此我们可以将数组中的所有元素按照奇偶性划分成两个部分,然后对两部分分别按照大小进行排序,最后将它们合并起来即可。

在实现过程中,需要一个用于比较的函数cmp(),这个函数会在调用qsort()函数时被自动调用。

  1. 首先取出 a 和 b 判断它们的奇偶性:
  • 如果 a 和 b 都是偶数,则根据数值大小进行排序;
  • 如果 a 和 b 都是奇数,则也根据数值大小进行排序;
  • 如果 a 是奇数而 b 是偶数,那么就应该把 a 排在 b 的前面;
  • 如果 a 是偶数而 b 是奇数,那么就应该把 b 排在 a 的前面。
  1. 最后返回比较结果:
  • 若 ia < ib ,说明 a 应该排在 b 的前面;
  • 若 ia > ib ,说明 b 应该排在 a 的前面;
  • 若相等,则不需要变换相对位置,直接返回 0。

在主程序中,首先读入 T 表示数据组数,并循环处理每一组数据。对于每个数据组,首先读入 n 及 n 个整数,然后调用 qsort() 函数对整个数组进行排序。

代码

#include<stdio.h>
#include<stdlib.h>

// 比较函数,用于qsort进行排序
int cmp(const void *a,const void *b)
{
    int a1 = *(int *)a;  // 将a转换为int型后再取值
    int b1 = *(int *)b;  // 将a转换为int型后再取值
    
    if(a1%2==0 && b1%2==0)  // 如果均为偶数,按照大小升序排列
        return a1-b1;
    else if (a1%2!=0 && b1%2!=0)  // 如果均为奇数,按照大小升序排列
        return a1-b1;
    else if (a1%2!=0 && b1%2==0)  // 如果左侧为奇数,右侧为偶数,则将左侧放前面(即“小”的认为是“大”的)
        return -1;
    else  // 否则将右侧放前面
        return 1;
}

int main( )
{
    int T,n,i,j;
    scanf("%d",&T);
    for(i=1;i<=T;i++)
    {
        scanf("%d",&n);
        int a[n];
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[j]);  // 输入具体数据
        }
        
        qsort(a,n,sizeof(n),cmp);  // 调用qsort进行排序

        // 输出排序后的数组
        for (j = 0; j < n; j++) {
            printf("%d ", a[j]);
        }
        printf("\n");
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾乃宇宙欠债王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值