📜  C++ STL 中的 sort() vs. partial_sort() vs. nth_element() + sort()(1)

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

C++ STL 中的 sort() vs. partial_sort() vs. nth_element()

在C++ STL中,sort,partial_sort和nth_element是三种非常有用的排序算法。在本文中,我们将介绍这三种算法并比较它们之间的不同之处。

sort()

sort是STL中最常用的排序算法之一。它使用一个快速排序算法来对一系列元素进行排序。sort有两个重载版本:一个接受两个迭代器,一个接受三个迭代器。第一个版本会将整个范围内的元素进行排序,而第二个版本将子范围内的元素进行排序。

以下是sort的示例用法:

#include <algorithm>
#include <vector>

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

该代码将使用sort对nums向量进行排序。排序后的结果将是{1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9}。

partial_sort()

partial_sort是STL中的另一个排序算法。相比sort,它更加高效地处理大型数据集合,但它不会完全排序整个数据集合。partial_sort首先找到要排序的n个元素,排序它们,然后将它们放置在整个序列的前面。对于剩余未排序的元素,partial_sort会将它们插入到已排序的元素后面,但不会进行排序。

以下是partial_sort的示例用法:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> nums{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::partial_sort(nums.begin(), nums.begin() + 5, nums.end());
}

该代码将使用partial_sort将前5个元素排序。排序后的结果将是{1, 1, 2, 3, 3, 9, 5, 6, 5, 4, 5}。

nth_element() + sort()

nth_element结合sort,可以找到第n个元素或前n个元素。nth_element使用的算法和快速排序类似,但它不会完全排序整个数据集合。相反,它将第n个元素放在正确的位置上,并确保它前面的所有元素都比它小,后面的所有元素都比它大。一旦找到第n个元素,我们可以对前n个元素进行排序以获得前n个元素的排名。

以下是nth_element结合sort的示例用法:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> nums{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::nth_element(nums.begin(), nums.begin() + 5, nums.end());
    std::sort(nums.begin(), nums.begin() + 5);
}

该代码将使用nth_element找到第6个元素(即第6个最小元素),然后对前5个元素进行排序。排序后的结果将是{1, 1, 2, 3, 3, 9, 5, 6, 5, 4, 5}。

总结

在C++ STL中,sort,partial_sort和nth_element是三种非常有用的排序算法。sort是最常用的排序算法之一,而partial_sort和nth_element可以在需要处理大型数据集合时提高效率。它们之间的主要区别在于partial_sort不会完全排序整个数据集合,而nth_element可以找到第n个元素或前n个元素。无论你需要哪种排序算法,STL都可以提供合适的工具来帮你解决问题。