数组奇偶操作
时间: 1ms 内存:128M
描述:
给你一个有n个整数的序列,a1,a2,a3,....an(下标从1开始)。
现在进行下列操作,将下标为奇数的元素按照升序排列,下标为偶数的元素按照降序排列,然后输出。
比如,给你n=8,序列为 2 6 7 1 3 8 9 4。
则下标为奇数的元素有2 7 3 9,排序后为2 3 7 9。
下标为偶数的元素有6 1 8 4,排序后为8 6 4 1。
则输出为 2 8 3 6 7 4 9 1
输入:
输入数据包含多组。每一组测试数据的第一行为一个整数n(n<1000),表示序列的个数,第二行有以空格隔开的n个整数a1,a2,a3,...an。输入数据以n=0结束
输出:
按要求输出,每一个序列占一行,每两个元素之间用空格隔开(每一行最后不应包含空格)。
示例输入:
8
2 6 7 1 3 8 9 4
0
示例输出:
2 8 3 6 7 4 9 1
提示:
参考答案(内存最优[1120]):
#include<stdio.h>
#include <string.h>
int main()
{
int n,i,j;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int b[1050],c[1050],a[1050]={0};
b[0]=0,c[0]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i%2==1)
b[++b[0]]=a[i];
else
c[++c[0]]=a[i];
}
int temp;
for(i=1;i<=b[0];i++)
for(j=i+1;j<=b[0];j++)
if(b[i]>b[j]){
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
for(i=1;i<=c[0];i++)
for(j=i+1;j<=c[0];j++)
if(c[i]<c[j]){
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
b[0]=c[0]=0;
for(i=1;i<=n;i++)
if(i%2==1)
a[i]=b[++b[0]];
else
a[i]=c[++c[0]];
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
参考答案(时间最优[3]):
#include<stdio.h>
int main()
{
int n,i,j,m,min,max,t;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
int a[n+1];
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i=i+2)
{
min=i;
{
for(j=min+2;j<=n;j=j+2)
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
for(i=2;i<=n;i=i+2)
{
max=i;
{
for(j=max+2;j<=n;j=j+2)
if(a[max]<a[j])
{
max=j;
}
}
if(max!=i)
{
t=a[i];
a[i]=a[max];
a[max]=t;
}
}
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。