排序算法-std::sort的使用(待学习第一天)
在C++中,STL(Standard Template Library)提供了一系列强大的排序算法,可以帮助你快速对容器中的元素进行排序。这些排序算法既高效又易于使用。以下是几种常用的排序库函数及其使用方法:
1. std::sort
std::sort
是最常用的排序函数之一,它可以在O(n log n)的时间复杂度内对随机访问迭代器范围内的元素进行排序。
示例:对vector排序
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 1, 4, 2};
// 对vector进行排序
std::sort(vec.begin(), vec.end());
// 输出排序后的vector
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
示例:自定义排序规则
你还可以通过传递一个比较函数或比较谓词来改变排序规则。例如,按照字符串长度排序:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
bool compareByLength(const std::string& a, const std::string& b) {
return a.size() < b.size();
}
int main() {
std::vector<std::string> words = {"banana", "apple", "pear", "orange"};
// 使用自定义比较函数对vector进行排序
std::sort(words.begin(), words.end(), compareByLength);
// 输出排序后的vector
for (const auto& word : words) {
std::cout << word << " ";
}
std::cout << std::endl;
return 0;
}
示例:使用lambda表达式自定义排序规则
使用C++11引入的lambda表达式可以让代码更加简洁:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main() {
std::vector<std::string> words = {"banana", "apple", "pear", "orange"};
// 使用lambda表达式对vector进行排序
std::sort(words.begin(), words.end(), [](const std::string& a, const std::string& b) {
return a.size() < b.size();
});
// 输出排序后的vector
for (const auto& word : words) {
std::cout << word << " ";
}
std::cout << std::endl;
return 0;
}
2. std::stable_sort
std::stable_sort
也是一个高效的排序算法,它保证排序是稳定的,即相等元素的相对顺序不变。这在某些场景下非常重要。
示例:使用std::stable_sort
排序
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
int main() {
std::vector<std::pair<std::string, int>> pairs = {{"a", 2}, {"b", 1}, {"c", 2}, {"d", 1}};
// 使用std::stable_sort排序,保持相等元素的相对顺序
std::stable_sort(pairs.begin(), pairs.end(), [](const auto& a, const auto& b) {
return a.second < b.second;
});
// 输出排序后的vector
for (const auto& p : pairs) {
std::cout << "(" << p.first << ", " << p.second << ") ";
}
std::cout << std::endl;
return 0;
}
3. std::partial_sort
std::partial_sort
可以对容器中的部分元素进行排序,特别适用于查找前N个最小或最大的元素。
示例:使用std::partial_sort
获取前N个最小元素
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 1, 4, 2, 6, 7, 8, 9, 0};
int N = 5;
// 对前N个元素进行排序
std::partial_sort(vec.begin(), vec.begin() + N, vec.end());
// 输出前N个最小元素
for (int i = 0; i < N; ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
return 0;
}
4. std::nth_element
std::nth_element
将第N个元素放到正确的位置,并对前N个元素进行部分排序,适用于查找中位数等场景。
示例:使用std::nth_element
查找中位数
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 1, 4, 2, 6, 7, 8, 9, 0};
int N = vec.size() / 2;
// 将第N个元素放到正确的位置
std::nth_element(vec.begin(), vec.begin() + N, vec.end());
// 输出中位数
std::cout << "中位数: " << vec[N] << std::endl;
return 0;
}
5. std::make_heap
, std::push_heap
, std::pop_heap
使用堆排序也可以实现高效排序,特别是对于动态插入和删除元素的场景。
示例:使用堆排序
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 1, 4, 2, 6, 7, 8, 9, 0};
// 构造一个堆
std::make_heap(vec.begin(), vec.end());
// 将堆顶元素移到末尾并重新构造堆
for (int i = vec.size() - 1; i > 0; --i) {
std::pop_heap(vec.begin(), vec.begin() + i + 1);
}
// 输出排序后的vector
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
通过上述示例,你可以看到C++ STL提供的排序库函数非常强大和灵活,可以根据具体需求选择最适合的算法。这些函数不仅提供了高效的排序实现,还支持自定义排序规则,使得代码更加简洁和易于维护。