📜  C++中std :: sort()的内部细节(1)

📅  最后修改于: 2023-12-03 14:59:49.787000             🧑  作者: Mango

C++ 中 std::sort() 的内部细节

简介

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() 函数的时间复杂度取决于排序算法和数据量。下面是不同数据量下排序时间的对比图:

sort-complexity

可以看到,std::sort() 函数的时间复杂度大致为 O(NlogN)。

稳定性

排序算法的稳定性是指对于值相等的元素,其相对顺序是否发生变化。std::sort() 函数是非稳定排序算法,即排序后不保证值相等的元素的相对顺序。

如果需要使用稳定排序算法,可以使用 std::stable_sort() 函数。

总结

本文介绍了 C++ 标准库中的 std::sort() 函数,包括排序算法、模板参数和时间复杂度等方面的内容。程序员在进行排序操作时,应该根据具体情况选择合适的排序函数。