std::sort 的注意事项

Luogu P1177 【模板】快速排序

\(\Large{AC}\) 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010]; 
bool cmp(int x,int y){
    return x<y;
}
signed main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++) cout<<a[i]<<("\n "[i!=n-1]);
    return 0;
}

\(\Large{TLE}\) 代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010]; 
bool cmp(int x,int y){
    return x<=y;
}
signed main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++) cout<<a[i]<<("\n "[i!=n-1]);
    return 0;
}

有木有发现就是第 \(5\) 行的 <<= 的区别...

这是由于 std::sortcmp(x,y) 类似于:

现在 xy 后(右)边,cmp 返回 x 是否应该超到 y 的前(左)边。

那为什么 <=\(\Large{TLE}\) 呢?

由于 std::sort 中的某些蜜汁操作,当有两个值相同的元素 \(x,y\) 时,程序里会反复交换 \(x,y\),导致 \(\Large{TLE}\)

所以啊,

std::sortcmp 时,若两个元素判定为相同的,请务必输出

\[\Large{False} \]

posted @ 2021-09-12 15:18  ShaoJia  阅读(201)  评论(0)    收藏  举报