【发布时间】:2018-01-07 08:04:30
【问题描述】:
我正在尝试解决在线法官系统中的一个问题:https://acm.cs.nthu.edu.tw/problem/11519/ 它需要一个整数 n,后跟 n 行名称和等级。 问题是使用稳定的排序算法按等级对它们进行排序。 我使用 qsort() 并在 compar() 中给出人的顺序来稳定 qsort()。这是我的代码:
class People{
public:
char name[11];
int grade;
int order;
void print(){ printf("%s %d\n", name, grade); }
};
int compar(const void *a, const void *b){
People *A = (People*)a;
People *B = (People*)b;
if(A->grade > B->grade) return 1;
else if(A->grade < B->grade) return -1;
else if(A->order > B->order) return 1;
else if(A->order < B->order) return -1;
}
int main(){
int n;
scanf("%d", &n);
People *p = new People[n];
for(int i=0;i<n;i++){
scanf("%s %d", p[i].name, &p[i].grade);
p[i].order = i;
}
qsort(p, n, sizeof(People), compar);
for(int i=0;i<n;i++){
p[i].print();
}
}
在我所有的测试用例中,它都没有任何问题,但是在线法官一直给我提交的四个 WA(错误答案)。有人可以给我一些关于这个的线索吗?非常感谢!
【问题讨论】:
-
如果你想要一个稳定的排序,C++ 标准库称之为
std::stable_sort -
@StoryTeller 但我使用变量“order”使其稳定。如果成绩相同,compar() 会比较唯一的顺序来决定顺序。
-
@Patricius 你不能用这个方法控制,qsort 不稳定,周期。
-
您不知道
qsort在所有标准库版本中的实现。您添加的支票可能会破坏它的保证。另外还有你的比较函数缺少返回语句的问题。只需为您的项目编写适当的严格弱排序,然后使用std::stable_sort -
叹息。是的,
qsort不稳定:它不保证比较相等 的元素的相对顺序。这并不意味着这种方法行不通:显式地对本来会比较相等的元素进行排序就可以了,因为它们不再比较相等。qsort不是这里的反派。我怀疑一个愚蠢的评分算法说qsort是错误的答案。