Description | ||
N个整数,将其排序输出。 输入 第一行是一个整数K(1<=K<=20),表示有多少个样例,每个样例的第一行是一个整数N(1<=N<=1,000)和一个字符X,X为A时表示升序排序,为D时为降序排列;第二行为N个整数,每个整数都可以使用int表示,每个之间用一个空格隔开。 输出 每个样例输出一行,按排序要求输出整数,每个整数之间输出一个空格。(最后一个整数后不要有空格) | ||
Sample Input | ||
2 3 A 3 5 2 4 D 2 5 7 3 | ||
Sample Output | ||
2 3 5 7 5 3 2 |
有两个思路:1.写一种排序,然后根据A D来选择正序输出或倒序输出。
2.写升降两种排序,根据A D来选择排序方法。
因为博主最近刚好学完了快排算法(快速排序),而且快排的升降序修改特别简单,改一下两个大于小于号就行,因此博主选择了方法二;
要注意的点是:1.快排的high是最后一个下标,不是数组长度,因此是n-1 。
2.最后一个数后面不输出空格,分成两部分输出,先输出带空格的前n-1个,再输出带回车的第n个。
最后就是,如果你也想学快排,建议看我的代码+去某字母ac站看视频讲解,csdn上的文字讲解,博主也看得头疼。
#include<stdio.h>
void quick_sort_A(int a[],int low,int high){
int i=low,j=high,st=a[low];
if(i>j) return;
while(i!=j){
while(i<j && a[j]>=st) j--;
while(i<j && a[i]<=st) i++;
if(i<j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[low]=a[i];
a[i]=st;
quick_sort_A(a,low,i-1);
quick_sort_A(a,i+1,high);
}
void quick_sort_D(int a[],int low,int high){
int i=low,j=high,st=a[low];
if(i>j) return;
while(i!=j){
while(i<j && a[j]<=st) j--;
while(i<j && a[i]>=st) i++;
if(i<j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[low]=a[i];
a[i]=st;
quick_sort_D(a,low,i-1);
quick_sort_D(a,i+1,high);
}
int main()
{
int K;
scanf("%d",&K);
int a[1000];
while(K--){
int n;
char ch;
scanf("%d %c",&n,&ch);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(ch=='A') quick_sort_A(a,0,n-1);
else if(ch=='D') quick_sort_D(a,0,n-1);
for(int ii=0;ii<n-1;ii++){
printf("%d ",a[ii]);
}
printf("%d\n",a[n-1]);
}
return 0;
}