交叉排序
交叉排序
题目描写叙述
输入N个数,把全部奇数位置上的数从小到大排序,把偶数位置上的数从大到小排序。
输入
输入的第一行是一个正整数N(2<=N<=100)。
第二行是N个用空格隔开的整数。
输出
输出仅仅有一行N个数。是按要求排序后的序列。用空格隔开。
演示样例输入
6 1 2 3 4 5 6
演示样例输出
1 6 3 4 5 2
一.冒泡
#include<stdio.h> #include<iostream> #include<string.h> #include<stack> using namespace std; int main() { int i,j,k,n,s,t,e,f; cin>>n; j=0; k=0; int a[110],b[110],c[110]; for(i=1; i<=n; i++) { cin>>c[i]; if(i%2==0) { a[j]=c[i]; j++; } else { b[k]=c[i]; k++; } } e=j; f=k; for(i=0; i<e-1; i++) { for(j=0; j<e-i-1; j++) if(a[j+1]>a[j]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } for(i=0; i<f-1; i++) { for(k=0; k<f-i-1; k++) if(b[k]>b[k+1]) { s=b[k]; b[k]=b[k+1]; b[k+1]=s; } } for(i=0; i<e; i++) { if(i == e-1 && n%2 == 0) { cout<<b[i]<<" " << a[i] << endl; } else if(i == e-1 && n%2 == 1) { cout<<b[i]<<" " << a[i] << " "; cout << b[i+1] << endl; } else { cout<<b[i]<<" " << a[i] << " "; } } }二、快排#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<stack> using namespace std; int cmp(const void *a,const void *b) { return *(int*)b - *(int*)a; } int main() { int n; while(cin >> n) { int a[10001],b[10001]; int j = 0,k = 0; for(int i=1; i<=n; i++) { if(i%2 == 0) { cin >> b[k++]; } else { cin >> a[j++]; } } sort(a,a+j); qsort(b,n,sizeof(b[0]),cmp); for(int i=0;i<k;i++) { if(i == k-1 && n%2 == 1) { cout << a[i] << " " << b[i] << " "; cout << a[i+1]; } else if(i == k-1 && n%2 == 0) { cout << a[i] << " " << b[i] << endl; } else { cout << a[i] << " " << b[i] << " "; } } } return 0; }