📜  在C++标准模板库(STL)中排序(1)

📅  最后修改于: 2023-12-03 15:37:34.978000             🧑  作者: Mango

在C++标准模板库(STL)中排序

排序是编程中十分常见的操作,可以帮助我们更快、更方便地处理数据。在C++标准模板库(STL)中,有三种排序方法:std::sort()std::stable_sort()std::partial_sort()

std::sort()

std::sort()是STL中最常用的排序方法,它可以快速地对一个序列进行排序。下面是一个示例:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::sort(vec.begin(), vec.end());
    // 现在 vec 中的内容为 1 1 2 3 3 4 5 5 5 6 9
    return 0;
}

上面的代码中,我们首先定义了一个 std::vector,然后用 std::sort() 函数对其进行排序。std::sort() 接受两个迭代器作为参数,表示要排序的序列的起始和结束位置。在上面的例子中,vec.begin()vec.end() 分别表示 vec 的起始位置和结束位置。排序的结果会覆盖原先的序列。

需要注意的是,std::sort() 函数默认使用的是 operator< 进行比较。如果我们要对一个自定义的类型进行排序,需要为该类型定义 operator<

#include <algorithm>
#include <vector>
#include <string>

class Person {
public:
    std::string name;
    int age;

    bool operator<(const Person &other) const {
        return age < other.age;
    }
};

int main() {
    std::vector<Person> vec = {
        {"Alice", 20},
        {"Bob", 18},
        {"Charlie", 22},
        {"David", 30},
        {"Eva", 25},
    };
    std::sort(vec.begin(), vec.end());
    // 现在 vec 中的内容为 Bob(18) Alice(20) Charlie(22) Eva(25) David(30)
    return 0;
}

上面的例子中,我们定义了一个 Person 类型,并为其定义了 operator<。我们用 std::sort()std::vector<Person> 进行排序,按照年龄从小到大排序。

std::stable_sort()

std::sort() 不同的是,std::stable_sort() 是一种稳定排序,它不会打乱原先两个元素的前后相对位置。下面是一个示例:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::stable_sort(vec.begin(), vec.end());
    // 现在 vec 中的内容为 1 1 2 3 3 4 5 5 5 6 9
    return 0;
}

需要注意的是,std::stable_sort() 的时间复杂度比 std::sort() 更高。如果不需要稳定排序,建议使用 std::sort()

std::partial_sort()

std::partial_sort() 可以对序列的前 k 个元素进行排序,其余元素的顺序不确定。下面是一个示例:

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

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::partial_sort(vec.begin(), vec.begin() + 5, vec.end());
    // 现在 vec 中的前 5 个元素为 1 1 2 3 3,其余的元素的顺序不确定
    for (int x : vec) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    return 0;
}

上面的例子中,我们用 std::partial_sort()vec 的前 5 个元素进行了排序。需要注意的是,std::partial_sort() 的时间复杂度为 $O(n\log k)$,其中 k 为前 k 个元素的个数。因此,在 k 较大时,建议使用 std::sort()