题目是: Description 有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 对于每个问题,输出排序后的结果。 格式为:每行输出一行数据,数据之间有一个空格。 Sample Input 2 6 14 38 11 89 -1 27 34 -1 27 12 34 -1 27 -1 92 2 3 1 -1 17 2 -1 1 1 -1 Sample Output 92 2 3 1 27 34 27 12 34 27 17 2 14 38 11 89 1 我是根据这种思路写的: 每行不足的补-2,直至长度一样,即 14 38 11 89 27 34 -2 -2 27 12 34 -2 27 -2 -2 -2 92 2 3 1 17 2 -2 -2 然后从最后一列开始排序,排完了再排下一列 第四列排序: 14 38 11 89 92 2 3 1 27 34 -2 -2 27 12 34 -2 27 -2 -2 -2 17 2 -2 -2 第三列排序: 27 12 34 -2 14 38 11 89 92 2 3 1 27 34 -2 -2 27 -2 -2 -2 17 2 -2 -2 第二列排序: 14 38 11 89 27 34 -2 -2 27 12 34 -2 92 2 3 1 17 2 -2 -2 27 -2 -2 -2 第一列排序: 92 2 3 1 27 34 -2 -2 27 12 34 -2 27 -2 -2 -2 17 2 -2 -2 14 38 11 89 #include<stdio.h> #include<stdlib.h> struct su{ long s[51]; }ss[1000]; int main(){ int t,n,i,j,max,k; struct su temp; while(scanf("%d",&t)!=EOF){ while(t--){ scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<50;j++) ss[i].s[j]=-2; max=0; for(i=0;i<n;i++){//输入 j=1; while(ss[i].s[j-1]!=-1){ scanf("%ld",&ss[i].s[j]); j++; } if(j>max)//max保留列最大 max=j; } for(j=max-1;j>=1;j--){ for(i=0;i<n;i++){//从最后一列对每行的数进行冒泡排序 for(k=0;k<n-i-1;k++){ if(ss[k].s[j]<ss[k+1].s[j]){ temp=ss[k]; ss[k]=ss[k+1]; ss[k+1]=temp; } } } } for(i=0;i<n;i++){//输出 for(j=1;j<max-1;j++){ if((ss[i].s[j]!=-1)&&(ss[i].s[j]!=-2)) printf("%ld",ss[i].s[j]); if(j!=max-2) printf(" "); } printf("\n"); } } } return 0; }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。