C++ STL sort 函數的用法


sort 在 STL 庫中是排序函數,有時冒泡、選擇等 $\mathcal O(n^2)$ 算法會超時時,我們可以使用 STL 中的快速排序函數 $\mathcal O(n \ log \ n)$ 完成排序

sort 在 algorithm 庫里面,原型如下:

template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

我們會發現 sort 有兩種形式一個有三個參數,一個有兩個參數,我們先講講兩個參數的吧!

sort 的前兩個參數是起始地址和中止地址

如:sort(a,a+n) 表示對 a[0] ... a[n-1] 排序

代碼如下:

#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
    int n,a[1001];
    scanf("%d",&n);
    for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);  //對a[1] ... a[n] 排序
    for (int i = 1;i <= n;i++) printf("%d",a[i]);
    return 0'
}

這樣是默認升序的,那如果是降序呢?

這樣,我們就要用到第三個參數,第三個參數是一個比較函數

bool cmp(int a,int b) { return a > b; }

這個就是降序排序的比較函數,意思是:

是 a > b 時為true,就不交換,a < b 時為 false,交換

然后我們調用 sort(a+1,a+n+1,cmp) 就可以對 a 數組進行排序了

還可以調用 greater 和 less 進行升/降序排序,其實就是一個幫你寫好的函數

int a[11],n; scanf("%d",&n);
for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1,greater<int>()); //升序
sort(a+1,a+n+1,less<int>()); //降序,注意尖括號內寫的是排序的數組類型

sort 也能對結構體排序,如:

#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
    int x,y;
} p[1001];
int n;
bool cmp(Node a,Node b) {
    if (a.x != b.x) return a.x < b.x;
    return a.y < b.y;
}
int main() {
    scanf("%d",&n);
    for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
    sort(p+1,p+n+1,cmp);
    for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
    return 0;
}

以上代碼的意思是,對 p 數組按 x 升序排序,若兩個數的 x 相等則按 y 升序排序

結構體還可以重載運算符(greater 和 less 都是重載運算符的),使 sort 只用兩個參數就可以按自己的規則排序,如:

#include <algorithm>
#include <cstdio>
using namespace std;
struct Node {
    int x,y;
    bool operator < (Node cmp) const {
        if (a.x != cmp.x) return a.x < cmp.x;
        return a.y < cmp.y;
    }
}p[1001];
int n;
/*bool cmp(Node a,Node b) { * if (a.x != b.x) return a.x < b.x; * return a.y < b.y; *} */
int main() {
    scanf("%d",&n);
    for (int i = 1;i <= n;i++) scanf("%d%d",&p[i].x,&p[i].y);
    sort(p+1,p+n+1);
    for (int i = 1;i <= n;i++) scanf("%d %d\n",p[i].x,p[i].y);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM