XTU-OJ 《C语言程序设计》 1097-排序

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

解题思路:本题最主要的问题是  怎样才能实现 升序、降序的排序。

在之后的数据结构中,我们要学习 排序算法。希望大家做到这题的时候能自行学习一些排序算法。

我们常用的有:选择排序、交换排序、插入排序等。这里作者采用的排序方法是 交换排序中的冒泡排序。如果会使用 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 

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;
}

你可能感兴趣的:(湘大OJ练习解析,c语言,算法,数据结构)