交叉排序

题目描述

输入N个数,把所有奇数位置上的数从小到大排序,把偶数位置上的数从大到小排序。

输入

输入的第一行是一个正整数N(2<=N<=100)。
第二行是N个用空格隔开的整数。

输出

输出只有一行N个数,是按要求排序后的序列,用空格隔开。

示例输入

6
1 2 3 4 5 6

示例输出

1 6 3 4 5 2

提示

 

来源

2011软件1-5班《程序设计基础》机试 tongjiantao

示例程序

错误代码:没有考虑当n取值为奇数的时候

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void Qsort(int a[],int l,int r)//快速排序
{
    int x=a[l];
    int i=l,j=r;
    if(l>=r)
        return;
    while(i<j)
    {
        while(i<j && a[j]>=x)
            j--;
        a[i]=a[j];
        while(i<j && a[i]<= x)
            i++;
        a[j]=a[i];
    }
    a[i]=x;
    Qsort(a,l,i-1);
    Qsort(a,i+1,r);
}
int main()
{
    int n,i;
    int num[101],a[55],b[55];//定义num数组用来存放原来的数组,a数组存放奇数位的数,b数组存放偶数位的数
    while(~scanf("%d",&n))
    {
        int j=1,k=1;//j,k为标记变量,初始化为1
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));//将两个数组置0
        for(i=1;i<=n;i++)
            scanf("%d",&num[i]);//输入原数据
        for(i=1;i<=n;i++)
        {//按数据位置的奇偶将数组分开
            if(i%2!=0)
              {
                 a[j++]=num[i];
              }
            else
            {
                b[k++]=num[i];
            }
        }
        Qsort(a,1,j-1);
        Qsort(b,1,k);//将两数组从小到大排序
        i=1;
        while(i<j && k!=0)
        {
            printf("%d",a[i]);//j奇数位的数字从小到大输出
            printf(" %d",b[k]);//偶数位的数字从大到小输出(倒序)
            if(k!=1)
                printf(" ");
            i++;
            k--;
        }
        printf("\n");
    }
    return 0;
}

修改后的正确代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void Qsort(int a[],int l,int r)//快速排序
{
    int x=a[l];
    int i=l,j=r;
    if(l>=r)
        return;
    while(i<j)
    {
        while(i<j && a[j]>=x)
            j--;
        a[i]=a[j];
        while(i<j && a[i]<= x)
            i++;
        a[j]=a[i];
    }
    a[i]=x;
    Qsort(a,l,i-1);
    Qsort(a,i+1,r);
}
int main()
{
    int n,i;
    int num[101],a[55],b[55];//定义num数组用来存放原来的数组,a数组存放奇数位的数,b数组存放偶数位的数
    while(~scanf("%d",&n))
    {
        int j=1,k=1;//j,k为标记变量,初始化为1
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));//将两个数组置0
        for(i=1;i<=n;i++)
            scanf("%d",&num[i]);//输入原数据
        for(i=1;i<=n;i++)
        {//按数据位置的奇偶将数组分开
            if(i%2!=0)
              {
                 a[j++]=num[i];
              }
            else
            {
                b[k++]=num[i];
            }
        }
        Qsort(a,1,j-1);
        Qsort(b,1,k-1);//调用快排函数对两个数组进行排序
        i=1;
        if(n % 2 ==0)//当n取值为偶数时
        {
            while(i<j && k-1 !=0)//成对输出
            {
                printf("%d",a[i]);
                printf(" %d",b[k-1]);
                if(k!=1)
                    printf(" ");
                i++;
                k--;
            }
            printf("\n");
        }
        else//当n为奇数时,奇数的个数要比偶数多1
        {
            while(i<j && k-1 !=0)
            {
                printf("%d",a[i]);
                printf(" %d",b[k-1]);
                if(k!=1)
                    printf(" ");
                i++;
                k--;
            }
            printf("%d\n",a[j-1]);//在成对输出后输出最后一个数字
        }
    }
    return 0;
}

 

posted @ 2014-10-30 10:54  夏迩  阅读(228)  评论(0)    收藏  举报