YTU OJ 3376: 配列パリティ操作

質問の説明

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) で、2 行目にはスペースで区切られた n 個の整数 a1、a2、a3、...an が含まれます。入力データはn=0で終わります

出力

必要に応じて出力します。各シーケンスは 1 行を占め、2 つの要素ごとにスペースで区切られます (各行の末尾にスペースを含めないでください)。

サンプル入力

8
2 6 7 1 3 8 9 4
0

サンプル出力

2 8 3 6 7 4 9 1

C++ コード:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 1040
拆分数组,拆成奇数下标与偶数下标
void part(int a[],int n,int b[],int c[],int &bl,int &cl)//b存放奇数下标,c存放偶数下标
{
    
    
	int i,j=0,k=0;
	for(i=0;i<n;i++)
	{
    
    
		if(i%2==0)//下标为奇数
		{
    
    
			b[j]=a[i];
			j++;
		}
		else
		{
    
    
			c[k]=a[i];
			k++;
		}
	}
	bl=j;
	cl=k;
}
void sort1(int a[],int n) //升序排序
{
    
    
	int i,j,t;
	for(i=0;i<n;i++)
	{
    
    
		for(j=0;j<n-i-1;j++)
		{
    
    
			if(a[j]>a[j+1])
			{
    
    
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
}
void sort2(int a[],int n)//降序排序
{
    
    
	int i,j,t;
	for(i=0;i<n;i++)
	{
    
    
		for(j=0;j<n-i-1;j++)
		{
    
    
			if(a[j]<a[j+1])
			{
    
    
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
}
void sum(int a[],int b[],int c[],int n)//合并
{
    
    
	int i,j=0,k=0;
	for(i=0;i<n;i++)
	{
    
    
		if(i%2==0)
		{
    
    
			a[i]=b[j];
			j++;
		}
		else
		{
    
    
			a[i]=c[k];
			k++;
		}
	}
}
int main()
{
    
    
	int n,a[MaxSize],b[MaxSize],c[MaxSize],i,bl=0,cl=0;
	while(scanf("%d",&n) && n!=0)
	{
    
    
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		part(a,n,b,c,bl,cl);
		sort1(b,bl);
		sort2(c,cl);
		sum(a,b,c,n);
		for(i=0;i<n;i++)
			printf("%d ",a[i]);
		printf("\n");
	}
	//system("pause");
	return 0;
}

おすすめ

転載: blog.csdn.net/u014295602/article/details/103296502