zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",p[i].x,p[i].y);
        return 0;
    }
  • 相关阅读:
    《构建之法》第四章学习笔记
    《深入理解计算机系统》第四章学习笔记
    《构建之法》第三章学习笔记
    《深入理解计算机系统》第三章学习笔记
    《文献管理与信息分析》第二讲学习笔记
    《深入理解计算机系统》第二章学习笔记
    20179223《Linux内核原理与分析》第十二周学习笔记
    《从问题到程序》第三章学习笔记
    51nod1256乘法逆元
    51nod1212无向图最小生成树
  • 原文地址:https://www.cnblogs.com/lrj124/p/7254043.html
Copyright © 2011-2022 走看看