EXCEL排序
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 32 Accepted Submission(s) : 8
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
Input
测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有 N 行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
Sample Input
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60 4 2 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0
Sample Output
Case 1: 000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2: 000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3: 000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90
Source
浙大计算机研究生复试上机考试-2007年
View Code
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 typedef struct 5 { 6 int ID; 7 char num[10],name[10]; 8 9 }USER; 10 USER Student[100005]; 11 12 void quick_sort1(USER s[],int l,int r) 13 { 14 if(l<r) 15 { 16 int i=l,j=r,ID; 17 char x[10],name[10]; 18 strcpy(x,s[l].num); 19 strcpy(name,s[l].name); 20 ID=s[l].ID; 21 while (i<j) 22 { 23 while(i<j&&strcmp(s[j].num,x)>=0) 24 j--; 25 if(i<j) 26 s[i++]=s[j]; 27 while(i<j&&strcmp(s[i].num,x)<=0) 28 i++; 29 if(i<j) 30 s[j--]=s[i]; 31 } 32 strcpy(s[i].num,x); 33 strcpy(s[i].name,name); 34 s[i].ID=ID; 35 quick_sort1(s,l,i-1); 36 quick_sort1(s,i+1,r); 37 } 38 } 39 40 void quick_sort2(USER s[],int l,int r) 41 { 42 if(l<r) 43 { 44 int i=l,j=r,ID; 45 char x[10],num[10]; 46 strcpy(num,s[l].num); 47 strcpy(x,s[l].name); 48 ID=s[l].ID; 49 while (i<j) 50 { 51 while(i<j&&strcmp(s[j].name,x)>=0) 52 { 53 if(strcmp(s[j].name,x)==0&&strcmp(s[j].num,num)<0) 54 break; 55 j--; 56 } 57 if(i<j) 58 s[i++]=s[j]; 59 while(i<j&&strcmp(s[i].name,x)<=0) 60 { 61 if(strcmp(s[i].name,x)==0&&strcmp(s[i].num,num)>0) 62 break; 63 i++; 64 } 65 if(i<j) 66 s[j--]=s[i]; 67 } 68 strcpy(s[i].num,num); 69 strcpy(s[i].name,x); 70 s[i].ID=ID; 71 quick_sort2(s,l,i-1); 72 quick_sort2(s,i+1,r); 73 } 74 } 75 76 void quick_sort3(USER s[],int l,int r) 77 { 78 if(l<r) 79 { 80 int i=l,j=r,ID; 81 char name[10],num[10]; 82 strcpy(num,s[i].num); 83 strcpy(name,s[i].name); 84 ID=s[i].ID; 85 while (i<j) 86 { 87 while(i<j&&s[j].ID>=ID) 88 { 89 if(s[j].ID==ID&&strcmp(s[j].num,num)<0) 90 break; 91 j--; 92 } 93 if(i<j) 94 s[i++]=s[j]; 95 while(i<j&&s[i].ID<=ID) 96 { 97 if(s[i].ID==ID&&strcmp(s[i].num,num)>0) 98 break; 99 i++; 100 } 101 if(i<j) 102 s[j--]=s[i]; 103 } 104 s[i].ID=ID; 105 strcpy(s[i].name,name); 106 strcpy(s[i].num,num); 107 quick_sort3(s,l,i-1); 108 quick_sort3(s,i+1,r); 109 } 110 } 111 112 int main() 113 { 114 int N,i,change,times; 115 times=1; 116 while(scanf("%d %d",&N,&change),N) 117 { 118 for(i=0;i<N;i++) 119 scanf("%s %s %d",Student[i].num,Student[i].name,&Student[i].ID); 120 switch(change) 121 { 122 case 1:quick_sort1(Student,0,i-1);break; 123 case 2:quick_sort2(Student,0,i-1);break; 124 case 3:quick_sort3(Student,0,i-1);break; 125 } 126 printf("Case %d: ",times++); 127 for(i=0;i<N;i++) 128 printf("%s %s %d ",Student[i].num,Student[i].name,Student[i].ID); 129 } 130 return 0; 131 }