ECNU OJ 2947 行数据的排序

有 N 行数据,每行有若干数量不等的整数组成。现在要对这 N 行数据排序。排序原则为:首先比较行中的第一个数的值,将第一个数大的行排在前面;若第一个数相等的话,则按照第二个数的值排序(若某行没有第二个数,则该行排在后面);若第二个数还是相等的话,则比较第三个数,依次类推。

例如:

14 38 11 89

27 34

27 12 34

27

92 2 3 1

17 2

排序的结果为:

92 2 3 1

27 34

27 12 34

27

17 2

14 38 11 89

Input

第 1 行:整数 T (1T10) 为问题数

第 2 行:第一个问题的整数 N (1≤N≤1000)

第 3 ∽ N+2 行:第一个问题的每行的数据 ai 和表示行结束的标志-1, 1≤数据个数≤50。0≤ai≤10^9, 数据之间由一个空格分隔。

后面是第 2 ∽ T 个问题的数据。格式与第一个问题相同。

Output

对于每个问题,输出排序后的结果。

格式为:每行输出一行数据,数据之间有一个空格。

#include <stdio.h>

int line_data[1000][51];

//首先比较行中第一个数的值,将第一个数大的行排在前边
//如果第一个数相等,按照第二个数的值排序
//若某行没有第二个数的话,该行排在后边
//如果第二个数还是相等,则比较第三个数,以此类推

int cmp(cont void *a, const void *b)
{
    int *s1 = (int *a);
    int *s2 = (int *b);
    while (*s1 != -1 && s2 != -1 && *s1 = *s2){ //若相等比较下一个,
                                                //若不等,跳出循环
                                                //若为-1,亦跳出循环
        s1++;
        s2++;
    }
    return *s2 - *s1; //跳出循环后,降序排列

}
int main(void)
{
    int n;
    scanf("%d", &n);
    for ( int k = 0; k < n; k++ ){
        int j = 0;
        while(scanf("%d", &line_data[k][j]) && line_data[k][j] != -1){
            j++;
        }        
    }

    qsort(line_data,n, sizeof(line_data[0]), cmp);
    for (int k =0; k < n; k++){
        for ( int j = 0; line_data[k][j+1] != -1; j++ )
            printf("%d ", line_data[k][j]);
        printf("%d", line_data[k][j]);
    }

}

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注