http://acm.hdu.edu.cn/showproblem.php?pid=1872 出现错误后,用的是直接插入排序的方式,进行稳定排序的。 #include<stdio.h> #include<string.h> struct Student { char name[53]; int score; }; Student students[505],s[505]; int N; int Find(char x[]) { int i; for(i=0;i<N;i++) { if(strcmp(students[i].name,x)==0) return i; } return -1; } void WSort() //插入排序 { int i,j,k,temp1; char temp2[53]; for(i=1;i<N;i++) { for(j=i-1;j>=0;j--) { if(students[j].score>=students[i].score) { temp1 = students[i].score; memset(temp2,0,53); strcpy(temp2,students[i].name); for(k=i;k>j+1;k--) { students[k].score = students[k-1].score; memset(students[k].name,0,53); strcpy(students[k].name,students[k-1].name); } students[j+1].score = temp1; memset(students[j+1].name,0,53); strcpy(students[j+1].name,temp2); break; } } if(j<0) // the biggist { temp1 = students[i].score; memset(temp2,0,53); strcpy(temp2,students[i].name); for(k=i;k>0;k--) { students[k].score = students[k-1].score; memset(students[k].name,0,53); strcpy(students[k].name,students[k-1].name); } students[0].score = temp1; memset(students[0].name,0,53); strcpy(students[0].name,temp2); } } for(i=0;i<N;i++) { printf("%s %d/n",students[i].name,students[i].score); } } int main() { int i,pastindex,nowindex; bool flg1,flg2; while(scanf("%d",&N)!=EOF) { for(i=0;i<N;i++) { scanf("%s %d",students[i].name,&(students[i].score)); } pastindex=0; flg1 = false; // is error flg2 = false; for(i=0;i<N;i++) { scanf("%s %d",s[i].name,&(s[i].score)); if(i==0) { continue; } nowindex = Find(s[i].name); if(s[i].score>s[i-1].score) { flg1 = true; break; } else if(s[i].score==s[i-1].score&&!flg2) { pastindex = Find(s[i-1].name); if(nowindex < pastindex) { flg2 = true; } } } if(!flg1&&!flg2) { printf("Right/n"); } else if(!flg1&&flg2) { printf("Not Stable/n"); WSort(); } else { printf("Error/n"); WSort(); } for(i=0;i<505;i++) //clean { memset(students[i].name,0,53); students[i].score = 0; memset(s[i].name,0,53); s[i].score = 0; } } return 0; }