C - 稳定排序
解题思路:将原来的数据进行正确的排序以后,和题目给出的排好序的数据进行比较。(1)在第i名时,发现成绩不同,则一定是排序错误;(2)成绩相同,但是姓名不同,则应该是不稳定,但还应待定;(3)姓名和成绩均相同,则计数,到数据结束时计数等于n时则说明排序正确
#include<bits/stdc++.h>
using namespace std;
int n;
struct student{
char name[];
int gra, d;
}stu1[], stu2[];
bool cmp(student &a, student &b){
if(a.gra != b.gra)
return a.gra > b.gra;
return a.d < b.d;
}
int main(){
while(~scanf("%d",&n)){
for(int i=; i<n; i++){
scanf("%s %d",stu1[i].name, &stu1[i].gra);
stu1[i].d = i;
}
for(int i=; i<n; i++){
scanf("%s %d",stu2[i].name, &stu2[i].gra);
stu2[i].d = i;
}
sort(stu1, stu1+n, cmp);
int is = ;
for(int i=; i<n; i++){
int nam = strcmp(stu1[i].name, stu2[i].name);
if(nam == && stu1[i].gra == stu2[i].gra)//名字和成绩均相同
is ++;
else if(nam && stu1[i].gra == stu2[i].gra)//名字不同,成绩相同,可能是不稳定,待定
is = -;
else{//成绩都不同,肯定错误
is = -;
break;
}
}
if(is == n)
printf("Right\n");
else {
if(is == -)
printf("Error\n");
else
printf("Not Stable\n");
for(int i=; i<n; i++)
printf("%s %d\n",stu1[i].name, stu1[i].gra);
}
}
return ;
}