有 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 (1≤T≤10) 为问题数
第 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]); } }