排序之交叉排序

题目:
交叉排序
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版权协议,转载请附上原文出处链接和本声明。