用 C++ STL 轻松搞定排序 | 青训营 X 豆包MarsCode AI 刷题

81 阅读2分钟

用 C++ STL 轻松搞定排序

大家好!今天我们来聊聊 C++ 标准模板库(STL)里的那些排序小工具。你可能会想,为什么我们要在意这些排序算法呢?其实,排序在很多程序中都扮演着很重要的角色。幸运的是,C++ 已经帮我们搞定了不少事情。让我们一起看看怎么用 STL 里的函数来让排序变得简单又高效。

快速排序神器:std::sort

先来聊聊 std::sort,这个函数基本上是我们进行排序的首选。它用的是一种混合排序算法,能在大多数情况下实现快速排序。

怎么用?

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {5, 2, 9, 1, 5, 6};
    std::sort(numbers.begin(), numbers.end());

    for (int n : numbers) {
        std::cout << n << ' ';
    }
    return 0;
}

就这么简单,std::sort 默认从小到大排序。如果你想进行降序排序,只要加个比较函数就行了:

std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return b < a; });

这样,numbers 就会从大到小排序。

稳定排序:std::stable_sort

有时候,我们不仅需要排序,还要保持相同元素的顺序。这时候 std::stable_sort 就派上用场了。它和 std::sort 用法差不多,但在内部实现上更复杂,适合需要保持顺序的场合。

std::stable_sort(numbers.begin(), numbers.end());

如果你有个数据结构,比如说员工名单,按年龄排序时希望姓名的顺序不变,那这个函数就很适合。

部分排序:std::partial_sort

假设你只想要找出列表中最大的三个数,怎么办?用 std::partial_sort 吧。只会把你感兴趣的部分排序,把前面几名挑出来。

std::partial_sort(numbers.begin(), numbers.begin() + 3, numbers.end());

这样,numbers 的前三个元素就是最大(或最小)的。

自定义数据类型的排序

要是你有一个自定义的类型,比如存储了姓名和年龄的结构体,也不用担心。我们可以写一个小函数告诉 std::sort 怎么比较这些结构体。

struct Person {
    std::string name;
    int age;
};

bool compareByAge(const Person& a, const Person& b) {
    return a.age < b.age;
}

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
    std::sort(people.begin(), people.end(), compareByAge);

    for (const auto& person : people) {
        std::cout << person.name << ": " << person.age << '\n';
    }
    return 0;
}

通过这个 compareByAge 函数,我们可以很轻松地按年龄对 Person 对象进行排序。

总结一下

总之,C++ STL 的排序功能真的很实用,让你省去了自己实现复杂算法的麻烦。无论是简单的从小到大排序,还是复杂的自定义结构体排序,STL 都能帮你搞定。所以,话不多说,快去试试这些函数吧,看看它们能给你的代码带来多大变化!