欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sort

程序员文章站 2024-03-17 08:30:40
...

srot

提醒:不要觉得这些很难,你觉得现在掌握的知识跟不上,就不学了,想等着以后老师教。

emmm, 放心,这些老师不会教,you不自己学,you就永远也不会。STL就是一个工具,仅此而已。

不要一看到新事物,就觉得自己一定不会。不是的。

一:sort的引入?
sort是一个工具,更标准的来说,sort是一个函数
像scanf,scanf就是一个函数,他也是一个工具,作用是输入数据
而 sort的作用是排序
在C语言中scanf的头文件是:<stdio.h>
而 sort的头文件是
不需要深究,问,就是龟腚
二:sort的用法
scanf的用法: scanf("%d", &x);
而sort也有规范的用法:
若有一个数组a,总大小是N
那么: sort(a, a + N);
更规范一点:sort( 数组的初始位置,数组的结束位置 );
结果是a中的元素,从小到大排序。
三:更近一步
sort默认的是从小到大排序
如果想让sort从大到小排序呢???
可以自己定义排序的规则。需要自己写一个函数。
或许,你现在还要说,我没学过函数。
这也很简单。
main就是一个函数,main前面有个int,最后面有一个return 0;
所以main函数就是一个带有返回值的函数,如果main前面是void,那么main就是一个不带有返回值的函数。
先大概这么理解,可以粗略的想:如果有一个很复杂的程序,内容都在main函数里,让别人看了,岂不很不舒服,用函数就可以把这些代码分成块,封起来,用的时候,直接写main函数中;
当然函数也能实现一些特殊的效果。
就比如这个sort排序,用函数可以对sort自定义排序规则。

排序规则1:

代码就不给了,看看图片吧。

你看完之后有可能的疑惑:

  1. for(auto e : a)

    是啥玩意???再问,就去问同学,说题目的时候已经说了好几次。

    为了表示友好,还是在第二个输出中,用的普通的for,你只要知道,他们的作用是一样的!

  2. cmp里定义的两个int型,这表示对int型的数据做比较,你可以自己更改,改成char? double? 又或者string ? 都可以,自己去尝试。

sort

排序规则2:

结构体型数据,大一的同学,你们现在完全可以理解结构体,请往下看:

ps:如果你觉得你看懂,那你永远也看不懂。

结构体
就是把多个基本类型合起来,变成一个新的类型,你可以将两个int合起来,那么结构体就包含两个int的数据,这可以随便用。
也可以int int double, 也可以 string char int。。。随你
下面给出 结构体的简单定义:

sort

不明白,可以自己去搜。

假如你已经知道结构体是怎么回事了:

sort

sort

输出:

2 1
1 2
1 1

如果你能把上面的研究明白,那好,就已经了解sort的用法了,就有能力多做不少题了。

下面是另外几个定义排序的方法,可以尝试看,在排序规则2和下面的这些里面选一种使用即可:

排序规则3:

#include <iostream>
#include <algorithm>
using namespace std;

struct name
{
    int a;
    int b;
};

int main()
{
    name a[] = {{1, 2}, {1, 1}, {2, 1}};

    auto cmp = [](name x, name y) {
        if (x.a == y.a)
            return x.b > y.b;
        else
            return x.a > y.a;
    };

    sort(a, a + 3, cmp);

    for (auto e : a)
        cout << e.a << " " << e.b << endl;
    return 0;
}

排序规则4:

#include <iostream>
#include <algorithm>
using namespace std;

struct name
{
    int a;
    int b;
};

int main()
{
    name a[] = {{1, 2}, {1, 1}, {2, 1}};

    sort(a, a + 3, [](name x, name y) {
        if (x.a == y.a)
            return x.b > y.b;
        else
            return x.a > y.a;
    });

    for (auto e : a)
        cout << e.a << " " << e.b << endl;
    return 0;
}

排序规则5:

#include <iostream>
#include <algorithm>
using namespace std;

struct name
{
    int a;
    int b;
    bool operator<(const name e) const
    {
        if (a == e.a)
            return b > e.b;
        else
            return a > e.a;
    }
};

int main()
{
    name a[] = {{1, 2}, {1, 1}, {2, 1}};
    sort(a, a + 3);
    for (auto e : a)
        cout << e.a << " " << e.b << endl;
    return 0;
}