• 干货:详解C++ sort函数的cmp参数!


    学算法的第一天你在学冒泡、桶排

    在你还没搞明白快排和归并的时候

    你已经学到了数据结构最后的堆排序和希尔排序

    可以说排序是很多竞赛生的噩梦……


    于是它诞生了

    void std::sort()
    
    Sort the elements of a sequence using a predicate for comparison.
    
    参数:
    __first – An iterator.
    __last – Another iterator.
    __comp – A comparison functor.
    

    针对一个地址区间完成排序,算法每次自动选择,以快排为主

    C++需要头文件#include <algorithm>(当然万能头我也没意见)

    最简单的就是用它完成int类型升序排序

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main() {
        int a[5] = {2, 1, 3, 5, 4};
        sort(a, a + 5);
        for (int i = 0; i < 5; i++) cout << a[i] << " ";
    }
    

    输出如下,很简单

    1 2 3 4 5 
    

    这里传入给sort的参数 aa + 5 都是地址,和大多数编程语言一样,这里遵循左闭右开原则,即函数实际会读取和操作的五个地址如下:
    a + 0
    a + 1
    a + 2
    a + 3
    a + 4

    如果需要降序排序,程序如下

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    bool cmp(int x, int y){
        return x > y;
    }
    
    int main() {
        int a[5] = {2, 1, 3, 5, 4};
        sort(a, a + 5, cmp);
        for (int i = 0; i < 5; i++) cout << a[i] << " ";
    }
    

    输出

    5 4 3 2 1 
    

    我们多写了一个bool类型的cmp函数,并将其地址作为第3个参数传给了sort

    cmp可以替换其内置的函数来判断究竟该让哪些元素在前哪些元素在后

    很多小伙伴可能有个疑惑:如何从实质上理解cmp函数,或者说我究竟该怎么记住cmp怎么写呢?

    我们来看这三个点:

    1. 毋庸置疑,cmp函数返回bool类型,表示当前排序是否正确(具体见3)
    2. cmp函数应接受两个参数,类型与要排序的数组相同(可以是int、short和long long这些常见类型,当然也可以是结构体)
    3. cmp返回值的实际意义是传入a、b两个参数,a在前b在后的排序是否是正确的,若是正确的返回1(true),否则返回0(false)

    那么我们再看一个结构体的排序实例:输入10个学生的名字和成绩,按照成绩从高到低排序后输出

    输入数据:

    Yixiangzhilv 90
    Mydr 60
    Xiaoming 10
    Mr.Glass 60
    GZN 80
    Wangzi 85
    Hyx 100
    Wyx 99
    Xth 0
    Zz 75
    

    程序实现如下

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    struct node {
        string name;
        int score;
    };
    
    bool cmp(struct node x, struct node y) {
        return x.score > y.score;
    }
    
    int main() {
        struct node a[10];
        for (int i = 0; i < 10; i++) cin >> a[i].name >> a[i].score;
        sort(a, a + 10, cmp);
        for (int i = 0; i < 10; i++) cout << a[i].name << " " << a[i].score << endl;
    }
    

    (此处还有一个C++知识:如果已经定义结构体node,那么 struct node a[10];node a[10]; 都是合法的)


    相关刷题:P1786 帮贡排序 - 洛谷 | 计算机科学教育新生态

    题解:算法刷题【洛谷P1786】帮贡排序——算法刷题细思极恐现象!_异想之旅的博客-CSDN博客

    异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为CSDN、博客园、简书和开源中国账号,后期可能会有个人博客,除此之外全部是盗文!本文博客园链接https://www.cnblogs.com/yxzl/p/cpp-sort-cmp.html
  • 相关阅读:
    笔记-迎难而上之Java基础进阶4
    笔记-迎难而上之Java基础进阶3
    笔记-迎难而上之Java基础进阶1
    7天学完Java基础之7/7
    Java学习笔记(3)--- 内部类,基本数据类型
    C++ 基础语法 快速复习笔记(3)---重载函数,多态,虚函数
    C++ 基础语法 快速复习笔记---面对对象编程(2)
    C++ 基础语法 快速复习笔记(1)
    堆与栈(heap and stack)在c/c++的应用(概念)
    Python爬虫入门教程 5-100 27270图片爬取
  • 原文地址:https://www.cnblogs.com/yxzl/p/cpp-sort-cmp.html
Copyright © 2020-2023  润新知