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