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() 进行升序排序的示例:
输出结果为:
降序
如果想进行降序排序,可以提供一个自定义的比较函数,即根据自己内容确定的判断规则,
输出结果为:
如进行非极大抑制中通过置信度进行排序:
上面的例子是根据定义的排序函数cmp,进行的从大到小的排序。
std::stable_sort()
std::stable_sort() 也是一种O(n log n)时间复杂度的排序算法,但它保证稳定性,即相等的元素将保持其原始顺序。这使得它在需要保持相等元素顺序的场景中很有用。注意,稳定排序的代价是额外的空间复杂度。
示例:
输出:
可以看到结果与 std::sort() 结果相同,但 std::stable_sort() 保证了稳定性。std::partial_sort()
std::partial_sort() 可以对序列进行部分排序。它需要一个起始迭代器、一个结束迭代器和一个比较函数,将序列排序到给定的位置。它使用快速排序或堆排序,平均时间复杂度为O(n log n)。注意,std::partial_sort() 不保证稳定性。
函数原型:
这里 ForwardIt 是输入迭代器类型,Compare 是比较函数或函数对象,first, middle, last 是定义范围的迭代器。
std::partial_sort() 函数使用 comp 参数提供的比较函数(也可以是函数对象或 lambda 表达式)来对范围内的元素进行排序。比较函数(或函数对象)应接受两个参数,并返回一个布尔值,表示第一个参数是否应该在排序后的序列中出现在第二个参数之前。
std::partial_sort() 将 first 和 last 范围内的元素排序,使得 first 到 middle 范围内的元素都比 middle 指向的元素小,middle 到 last 范围内的元素都比 middle 指向的元素大。注意,middle 指向的元素可能不在最终排序的位置。
上面示例是根据compare的规则进行的降序,只派了前三个元素的顺序,所以可以看到虽然输出的是5个数,但请注意整个向量并未完全排序。
总结
在选择排序函数时,需要考虑你的具体需求。如果你不需要保持相等元素的顺序,那么可以使用 std::sort()。如果你需要保持相等元素的顺序,那么可以使用 std::stable_sort()。如果你只想对序列的一部分进行排序,那么可以使用 std::partial_sort()。