问题 F: 数组奇偶排序(数组)
时间限制: 1 Sec 内存限制: 128 MB
提交: 195 解决: 89
[提交][状态][讨论版]
题目描述
输入n,输入n个整数。调整数字位置使得偶数在序列的前半部分,奇数在序列的后半部分。
注:自己根据样例输入、输出找到算法。
要求算法的时间复杂度为O(n)。
输入
测试次数t
每组测试数据格式如下:
整数个数n,后跟n个整数
输出
对每组测试数据,输出整数个数和调整后的整数序列
样例输入
3
4 1 2 3 4
8 12 32 67 13 1 9 4 97
6 1 32 9 43 12 0
样例输出
4 4 2 3 1
8 12 32 4 13 1 9 67 97
6 0 32 12 43 9 1
#include<stdio.h>
int main() {
int a[50],i,j,k,t,n,tmp;
int oddindex,evenindex;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
}
oddindex=0;
evenindex=n;
/**
*整体的思路就是
*从前往后用i下标找奇数
*从后往前找j下标偶数
*找到之后对调两个的值
*直到i j下标相遇
**/
while(oddindex<evenindex) {
for(i=oddindex; i<evenindex; i++) {
//from head find odd
if(a[i]%2==1) {
oddindex =i;
break;
}
}
for(j=evenindex-1; j>oddindex-1; j--) {
//from bottom find even
if(a[j]%2==0) {
evenindex =j;
break;
}
}
if(i<j) {
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i++;
j--;
}else{
break;
}
}
printf("%d ",n);
for(i=0; i<n; i++) {
if(i==n-1) {
printf("%d\n",a[i]);
} else {
printf("%d ",a[i]);
}
}
}
return 0;
}
/**************************************************************
Problem: 1377
Language: C++
Result: 正确
Time:0 ms
Memory:800 kb
****************************************************************/