题目描述
输入N个数,把所有奇数位置上的数从小到大排序,把偶数位置上的数从大到小排序。
输入
输入的第一行是一个正整数
N(2<=N<=100)。
第二行是 N 个用空格隔开的整数。
第二行是 N 个用空格隔开的整数。
输出
输出只有一行
N
个数,是按要求排序后的序列,用空格隔开。
示例输入
6 1 2 3 4 5 6
示例输出
1 6 3 4 5 2
#include<iostream>
#include<cstring>
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)/<strong><span style="font-size:18px;">/这里要注意结束递归的调用,否则就会死循环,没完没了的调用。</span></strong>
return ;
while(i<j)
{
while(i<j&&odd[j]>key)
j--;
odd[i]=odd[j];
while(i<j&&odd[i]<key)
i++;
odd[j]=odd[i];
}
odd[i]=key;
qsort(left,i-1,odd);
qsort(i+1,right,odd);
}
void merger(int n,int top1,int m,int end1,int even[])
{
int len=0,top=n,end=m;
while(top<=top1&&end<=end1)
{
if(even[top]>even[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++)//<strong><span style="font-size:18px;">这里i==n的意思是,你能改变数组值的大小,但是你不能改变数组所在区间的大小,也就是你不能改变数组的位置,否则当两个数组合并时,</span></strong>
<strong><span style="font-size:18px;">你就找不到相应的元素了。</span></strong>
even[i]=temp[i-n];
}
void merger_sort(int low,int high,int even[])
{
int mid=(high-low)/2+low;
if(low<high)
{
merger_sort(low,mid,even);
merger_sort(mid+1,high,even);
merger(low,mid,mid+1,high,even);
}
}
int main()
{
int n,odd[101],even[101],num[101];
int len1=0,len2=0,t;
cin>>n;
for(t=1;t<=n;t++)
{
cin>>num[t];<strong><span style="font-size:14px;">//这里把奇数位置和偶数位置上的数分别存入两个数组</span></strong>
if(t%2==0)
even[len2++]=num[t];
else
odd[len1++]=num[t];
}
qsort(0,len1-1,odd);//<strong>奇数我用了快排,就当熟练快排的写法了。</strong>
merger_sort(0,len2-1,even);//<strong>偶数我用了归并</strong>
int i=0,j=0;
while(i<len1&&j<len2)
{
cout<<odd[i++]<<" "<<even[j++]<<" ";
}
while(j<len2)//<strong>这里注意奇数偶数的个数不一样,要输完</strong>
cout<<even[j++]<<" ";
while(i<len1)
cout<<odd[i++]<<" ";
cout<<endl;
}