输入一个整数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()
函数时被自动调用。
- 首先取出 a 和 b 判断它们的奇偶性:
- 如果 a 和 b 都是偶数,则根据数值大小进行排序;
- 如果 a 和 b 都是奇数,则也根据数值大小进行排序;
- 如果 a 是奇数而 b 是偶数,那么就应该把 a 排在 b 的前面;
- 如果 a 是偶数而 b 是奇数,那么就应该把 b 排在 a 的前面。
- 最后返回比较结果:
- 若
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;
}