【C++】sort()、stable_sort()和partial_sort()排序函数详解

简介: 【C++】sort()、stable_sort()和partial_sort()排序函数详解

std::sort(), std::stable_sort(), 和 std::partial_sort() 是C++标准库中的排序函数,它们各有不同的特点和适用场景。本文通过示例进行详细解读

std::sort()

std::sort() 是 C++ 标准库中的一个函数,用于对序列进行排序,是C++标准库中最常用的排序函数。它使用一种称为快速排序的算法,该算法的平均时间复杂度为O(n log n)。std::sort() 不保证稳定性,也就是说,相等元素的原始顺序可能会在排序后被改变。

它需要传入两个迭代器,表示要排序的范围。默认情况下,std::sort() 使用升序排序,但也可以提供一个自定义的比较函数或 lambda 表达式来指定降序排序或其他排序方式。

升序

下面是一个使用 std::sort() 进行升序排序的示例:

image.png

输出结果为:

image.png


降序

如果想进行降序排序,可以提供一个自定义的比较函数,即根据自己内容确定的判断规则,

image.png

输出结果为:

image.png

如进行非极大抑制中通过置信度进行排序:

image.png

上面的例子是根据定义的排序函数cmp,进行的从大到小的排序。

std::stable_sort()

std::stable_sort() 也是一种O(n log n)时间复杂度的排序算法,但它保证稳定性,即相等的元素将保持其原始顺序。这使得它在需要保持相等元素顺序的场景中很有用。注意,稳定排序的代价是额外的空间复杂度。

示例:

image.png

输出:

image.png

可以看到结果与 std::sort() 结果相同,但 std::stable_sort() 保证了稳定性。std::partial_sort()

std::partial_sort() 可以对序列进行部分排序。它需要一个起始迭代器、一个结束迭代器和一个比较函数,将序列排序到给定的位置。它使用快速排序或堆排序,平均时间复杂度为O(n log n)。注意,std::partial_sort() 不保证稳定性。

函数原型:

image.png

这里 ForwardIt 是输入迭代器类型,Compare 是比较函数或函数对象,first, middle, last 是定义范围的迭代器。

 

std::partial_sort() 函数使用 comp 参数提供的比较函数(也可以是函数对象或 lambda 表达式)来对范围内的元素进行排序。比较函数(或函数对象)应接受两个参数,并返回一个布尔值,表示第一个参数是否应该在排序后的序列中出现在第二个参数之前。

 

std::partial_sort() 将 first 和 last 范围内的元素排序,使得 first 到 middle 范围内的元素都比 middle 指向的元素小,middle 到 last 范围内的元素都比 middle 指向的元素大。注意,middle 指向的元素可能不在最终排序的位置。

image.png

image.png  

上面示例是根据compare的规则进行的降序,只派了前三个元素的顺序,所以可以看到虽然输出的是5个数,但请注意整个向量并未完全排序。

 

总结

在选择排序函数时,需要考虑你的具体需求。如果你不需要保持相等元素的顺序,那么可以使用 std::sort()。如果你需要保持相等元素的顺序,那么可以使用 std::stable_sort()。如果你只想对序列的一部分进行排序,那么可以使用 std::partial_sort()。

 

目录
相关文章
|
28天前
|
算法 搜索推荐 C++
浅谈sort函数底层(一道c++面试的天坑题)
浅谈sort函数底层(一道c++面试的天坑题)
|
2月前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
34 0
|
2月前
|
算法 搜索推荐 程序员
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(一)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
41 0
|
2月前
|
机器学习/深度学习 算法 搜索推荐
【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)
【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)
|
4月前
|
C++
C++如何进行sort的使用——C++如何进行排序
C++如何进行sort的使用——C++如何进行排序
29 0
|
4月前
|
C++
C++中sort排序
C++中sort排序
|
5月前
|
C++ 容器
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
|
10月前
|
搜索推荐 C++
C++利用sort进行排序
C++利用sort进行排序
|
11月前
|
C++
【PAT甲级 - C++题解】1067 Sort with Swap(0, i)
【PAT甲级 - C++题解】1067 Sort with Swap(0, i)
71 0
【PAT甲级 - C++题解】1067 Sort with Swap(0, i)
|
11月前
|
C++
【PAT甲级 - C++题解】1101 Quick Sort
【PAT甲级 - C++题解】1101 Quick Sort
42 0