交叉排序

题目描述

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

输入

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

输出

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

示例输入

6
1 2 3 4 5 6

示例输出

1 6 3 4 5 2
#include
#include
using namespace std;
int temp[101];
void qsort(int left,int right,int odd[])
{
    int i=left,j=right;
    int key=odd[left];
    if(i>j)//这里要注意结束递归的调用,否则就会死循环,没完没了的调用。
        return ;
    while(ikey)
            j--;
        odd[i]=odd[j];
        while(ieven[end])
            temp[len++]=even[top++];
        else
            temp[len++]=even[end++];
    }
    while(top<=top1)
        temp[len++]=even[top++];
    while(end<=end1)
        temp[len++]=even[end++];
    int i;
    for(i=n;i<=end1;i++)//这里i==n的意思是,你能改变数组值的大小,但是你不能改变数组所在区间的大小,也就是你不能改变数组的位置,否则当两个数组合并时,
你就找不到相应的元素了。
        even[i]=temp[i-n];
}
void merger_sort(int low,int high,int even[])
{
    int mid=(high-low)/2+low;
    if(low>n;
    for(t=1;t<=n;t++)
    {
        cin>>num[t];//这里把奇数位置和偶数位置上的数分别存入两个数组
        if(t%2==0)
            even[len2++]=num[t];
        else
            odd[len1++]=num[t];
    }
    qsort(0,len1-1,odd);//奇数我用了快排,就当熟练快排的写法了。
    merger_sort(0,len2-1,even);//偶数我用了归并
    int i=0,j=0;
    while(i这里注意奇数偶数的个数不一样,要输完
        cout<

你可能感兴趣的:(排序)