交叉排序
题目描述
输入N个数,把所有奇数位置上的数从小到大排序,把偶数位置上的数从大到小排序。
输入
输入的第一行是一个正整数N(2<=N<=100)。
第二行是N个用空格隔开的整数。
第二行是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; }

浙公网安备 33010602011771号