题目:
交叉排序
Time Limit: 1000 ms Memory Limit: 32768 KiB
Submit Statistic Discuss
Problem Description
输入N个数,把所有奇数位置上的数从小到大排序,把偶数位置上的数从大到小排序。
Input
输入的第一行是一个正整数N(2<=N<=100)。
第二行是N个用空格隔开的整数。
Output
输出只有一行N个数,是按要求排序后的序列,用空格隔开。
Sample Input
6
1 2 3 4 5 6
Sample Output
1 6 3 4 5 2
Hint
解题代码
#include<stdio.h>
#include<stdlib.h>
#define max 1001
int c[max],a[max],b[max],d[max];
void mergesort(int s1,int e1,int s2,int e2)
{
int k=0;
int i=s1,j=s2;
while(i<=e1&&j<=e2)
{
if(c[i]<=c[j])
{
d[k++]=c[i++];
}
else
{
d[k++]=c[j++];
}
}
while(i<=e1)
{
d[k++]=c[i++];
}
while(j<=e2)
{
d[k++]=c[j++];
}
for(i=s1;i<=e2;i++)
{
c[i]=d[i-s1];
}
}
void merge(int c[],int s,int e)
{
int m;
if(s<e)
{
m=(s+e)/2;
merge(c,s,m);
merge(c,m+1,e);
mergesort(s,m,m+1,e);
}
}
void kuaisort(int b[],int left,int right)
{
int x=b[left],i=left,j=right;
if(i>=j)return ;
while(i<j)
{
while(i<j&&b[j]<=x)j--;
b[i]=b[j];
while(i<j&&b[i]>=x)i++;
b[j]=b[i];
}
b[i]=x;
kuaisort(b,left,i-1);
kuaisort(b,i+1,right);
return ;
}//快排从大到小,b,偶数
int main()
{
int n,i;
int ou=0,ji=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if((i+1)%2==0)
{
b[ou++]=a[i];
}
else c[ji++]=a[i];
}
kuaisort(b,0,ou-1);
merge(c,0,ji-1);
/* 1.int ii=0,jj=0;
while(ii<ji&&jj<ou)
{
printf("%d %d ",c[ii++],b[jj++]);
}
while(ii<ji)
{
printf("%d",c[ii++]);
}
while(jj<ou)
{
printf("%d",b[ji++]);
}
*/
/* 2.if(n%2==0)
{
for(i=0;i<n/2-1;i++)
{
printf("%d %d ",c[i],b[i]);
}
printf("%d %d ",c[i],b[i]);
}
else
{
for(i=0;i<n/2-1;i++)
{
printf("%d %d ",c[i],b[i]);
}
printf("%d",c[i]);
}
*/
int ii=0,jj=0;
while(ii<ji&&jj<ou)
{
printf("%d %d ",c[ii++],b[jj++]);
}
if(ii<ji)
{
printf("%d",c[ii]);
}
return 0;
}
不同的输出方法,交叉排序其实就是把奇数偶数单独分开,放到两个不同的数组,然后用不同的排序进行处理
版权声明:本文为BHliuhan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。