sort排序疑惑
今天做到了一道题是这样的:
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄≥60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
输入格式
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄(不超过100岁),中间用单个空格隔开。
输出格式
按排好的看病顺序输出病人的ID,每行一个。
由于sort排序有不稳定性,所以有一种排序方案是加一个变量作为序号去排。
然后我们也可以使用stable_sort排序。这里stable_sort排序的比较函数的写法如下:
python bool cmp(Node a, Node b) { if (a.age >= 60 && b.age >= 60) {//都是老年人 return a.age > b.age; } return a.age >= 60;//老年人在前 }
这里在最开始的时候,就很疑惑,a.age>=60这里如果返回false,那么a和b不就交换了吗?
最开始查找了很多网上关于sort、stable_sort的文章,都没有说出个所以然来。
https://stackoverflow.com/questions/53254971/confusing-result-of-stdsort-stable-sort-compare-function-return-value
反正意思就是说当排序规则不满足下面这个图中的三个规则的时候,他是不进行处理的。
所以我们再来看这个a.age>=60这个规则,进入这个比较规则的时候,有一个前提条件就是a和b最多有一个是老人。
假设a和b一个年轻人一个老人,那么compare(a, b)=true, compare(b, a)=false,符合规则。所以会正常根据规则调整。
那么当a和b都是年轻人的时候,我们需要比较一下a和b了,此时compare(a, b)和compare(b, a)都会返回false。这不符合规则,所以他不会进行调整顺序操作。