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 3Sample Output
2 3 5 7 5 3 2
解题思路:本题最主要的问题是 怎样才能实现 升序、降序的排序。
在之后的数据结构中,我们要学习 排序算法。希望大家做到这题的时候能自行学习一些排序算法。
我们常用的有:选择排序、交换排序、插入排序等。这里作者采用的排序方法是 交换排序中的冒泡排序。如果会使用 C语言中自带的 qsort() 快速排序函数,这题会变得很简单。
在题目中,关于升序、降序问题,作者把它转化成了一个数学关系,在排序比较时,利用代码第 34 行的if判断语句:
if (num[j] * of > num[j+1] * of) 根据of的取值,实现是升序还是降序。
当 of == 1 时, 表明 num[j] > num[j+1],交换位置,实现升序 (较大的数往后移)
当 of == -1 时,表明 num[j] < num[j+1],交换位置,实现降序 (较小的数往后移)
注意:题目输出要求,每个数之间有空格,行末没有空格。所以要分两步输出。
AC代码:
#include <stdio.h>
void swap(int &x, int &y)
{
int t;
t = x;
x = y;
y = t;
}
int main()
{
char X;
bool flag;
int K,N,of;
int num[1010];
scanf("%d",&K);
while ( K --)
{
scanf("%d %c",&N,&X);
for (int i = 0; i < N; i ++)
scanf("%d",&num[i]);
if (X == 'A')
of = 1;
else
of = -1;
for (int i = N-1; i >= 0; i --) // 冒泡排序
{
flag = false;
for (int j = 0; j < i; j ++)
{
if (num[j] * of > num[j+1] * of)
{
swap(num[j],num[j+1]);
flag = true;
}
}
if (flag == false)
break;
}
printf("%d",num[0]);
for (int i = 1; i < N; i ++)
printf(" %d",num[i]);
printf("\n");
}
return 0;
}
该编程题要求根据输入的顺序(升序或降序)对一组整数进行排序。解决方案采用了冒泡排序算法,通过调整比较条件实现升序或降序。在C语言中,也可以使用qsort函数简化实现。
418

被折叠的 条评论
为什么被折叠?



