【ACM】杭電OJ 1862
阿新 • • 發佈:2018-11-25
用了三個快速排序的子函式進行排序,排序結束後,再從頭迴圈,判斷成績或者姓名是否相同。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <string> using namespace std; const int maxn =100000 + 100; typedef struct one_person_info { int id; string name; int grade; }N; N stu[maxn]; void quick_sort1(int left,int right) { int i,j; i=left;j=right; if(left<right) { stu[0]=stu[i]; while(i!=j) { while(stu[0].id<stu[j].id && i<j) j--; if(i<j) { stu[i]=stu[j]; i++; } while(stu[0].id>stu[i].id && i<j) i++; if(i<j) { stu[j]=stu[i]; j--; } } stu[i]=stu[0]; quick_sort1(left,i-1); quick_sort1(i+1,right); } } void quick_sort2(int left,int right) { int i,j; i=left;j=right; if(left<right) { stu[0]=stu[i]; while(i!=j) { while(stu[0].name<stu[j].name && i<j) j--; if(i<j) { stu[i]=stu[j]; i++; } while(stu[0].name>stu[i].name && i<j) i++; if(i<j) { stu[j]=stu[i]; j--; } } stu[i]=stu[0]; quick_sort2(left,i-1); quick_sort2(i+1,right); } } void quick_sort3(int left,int right) { int i,j; i=left;j=right; if(left<right) { stu[0]=stu[i]; while(i!=j) { while(stu[0].grade<stu[j].grade && i<j) j--; if(i<j) { stu[i]=stu[j]; i++; } while(stu[0].grade>stu[i].grade && i<j) i++; if(i<j) { stu[j]=stu[i]; j--; } } stu[i]=stu[0]; quick_sort3(left,i-1); quick_sort3(i+1,right); } } int num; int main () { char s[10]; int n,C,i,j,len,left,right; while(scanf("%d%d",&n,&C)==2) { if(n==0 && C==0) return 0; num++; for(i=1;i<=n;i++) { scanf("%d",&stu[i].id); cin>>stu[i].name; scanf("%d",&stu[i].grade); } printf("Case %d:\n",num); if(C==1) { quick_sort1(1,n); for(i=1;i<=n;i++) { itoa(stu[i].id,s,10); len=strlen(s); for(j=1;j<=6-len;j++) printf("0"); printf("%d ",stu[i].id); cout<<stu[i].name; printf(" %d\n",stu[i].grade); } } else if(C==2) { quick_sort2(1,n); i=1; while(i<n) { if(stu[i].name==stu[i+1].name) { left=i; while(stu[i].name==stu[i+1].name) i++; right=i; quick_sort1(left,right); } i++; } for(i=1;i<=n;i++) { itoa(stu[i].id,s,10); len=strlen(s); for(j=1;j<=6-len;j++) printf("0"); printf("%d ",stu[i].id); cout<<stu[i].name; printf(" %d\n",stu[i].grade); } } else if(C==3) { quick_sort3(1,n); i=1; while(i<n) { if(stu[i].grade==stu[i+1].grade) { left=i; while(stu[i].grade==stu[i+1].grade) i++; right=i; quick_sort1(left,right); } i++; } for(i=1;i<=n;i++) { itoa(stu[i].id,s,10); len=strlen(s); for(j=1;j<=6-len;j++) printf("0"); printf("%d ",stu[i].id); cout<<stu[i].name; printf(" %d\n",stu[i].grade); } } } return 0; }