📅  最后修改于: 2023-12-03 15:37:34.978000             🧑  作者: Mango
排序是编程中十分常见的操作,可以帮助我们更快、更方便地处理数据。在C++标准模板库(STL)中,有三种排序方法:std::sort()
、std::stable_sort()
、std::partial_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::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()
可以对序列的前 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()
。