📅  最后修改于: 2023-12-03 14:59:49.787000             🧑  作者: Mango
std::sort()
是 C++ 标准库中用于排序的函数,其可用于对各种 STL 容器以及普通数组等数据结构进行排序。使用 std::sort()
进行排序是 C++ 程序员的常用操作之一。
本文将详细介绍 std::sort()
的内部细节,包括排序算法、模板参数、时间复杂度等方面的内容。
在 C++11 标准以前,std::sort()
使用的是 Quick Sort 算法。而在 C++11 标准以后,std::sort()
改用了 Introsort 算法,它是一种将 Quick Sort 和 Heap Sort 结合的排序算法。
Introsort 算法的特点是:先使用 Quick Sort,但当递归层数达到一定深度时,为避免 Quick Sort 太深导致的性能问题,会切换到 Heap Sort,以此保证最坏情况下的时间复杂度为 O(NlogN)。
std::sort()
函数有两个模板参数,分别为容器迭代器类型和比较函数类型。下面是使用 std::sort()
对普通数组进行排序的示例:
int a[] = { 5, 2, 6, 1, 3, 9 };
std::sort(std::begin(a), std::end(a));
其中 std::begin()
和 std::end()
是 C++11 标准中新增的函数,用于获取普通数组的首尾迭代器。
std::sort()
函数的第二个模板参数为比较函数类型,默认情况下采用 <
运算符进行比较。如果需要按其他方式进行比较,可以传入自定义的比较函数,例如:
struct student {
int id;
std::string name;
bool operator<(const student& s) const {
return id < s.id;
}
};
std::vector<student> v { {2, "Tom"}, {1, "John"}, {3, "Mary"} };
std::sort(v.begin(), v.end());
上述代码使用了结构体的 <
运算符进行比较。
std::sort()
函数的时间复杂度取决于排序算法和数据量。下面是不同数据量下排序时间的对比图:
可以看到,std::sort()
函数的时间复杂度大致为 O(NlogN)。
排序算法的稳定性是指对于值相等的元素,其相对顺序是否发生变化。std::sort()
函数是非稳定排序算法,即排序后不保证值相等的元素的相对顺序。
如果需要使用稳定排序算法,可以使用 std::stable_sort()
函数。
本文介绍了 C++ 标准库中的 std::sort()
函数,包括排序算法、模板参数和时间复杂度等方面的内容。程序员在进行排序操作时,应该根据具体情况选择合适的排序函数。