STL提供的排序方法
在工作实战中, “不要重复发明轮子" 。在业界,排序算法已经很成熟稳定,几乎无提升空间,可以直接拿来使用。正在学习排序算法原理的同学除外。
STL提供以下几种排序方法
函数名 | 描述 |
---|---|
sort | 对给定区间所有元素进行排序 |
stable_sort | 对给定区间所有元素进行稳定排序 |
partial_sort | 对给定区间所有元素部分排序 |
partial_sort_copy | 对给定区间复制并排序 |
nth_element | 找出给定区间的某个位置对应的元素 |
is_sorted | 判断一个区间是否已经排好序 |
partition | 使得符合某个条件的元素放在前面 |
stable_partition | 对稳定的使得符合某个条件的元素放在前面 |
部分例子代码。
/*
STL提供的排序算法
关键语句:
std::sort(nums.begin(), nums.end());
std::sort(nums.begin(), nums.end(), std::greater<int>());
std::sort(students.begin(), students.end());
std::sort(students.begin(), students.end(),Student::compare);
std::partial_sort(students.begin(), students.begin()+3, students.end(),Student::compare);
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Student{
public:
int number;
std::string name;
float score;
//重载'<'操作符, 定义Student的比较函数
bool operator < (const Student& st) {
return score > st.score;
}
//比较函数
static bool compare(const Student& st1, const Student& st2) {
return st1.score > st2.score;
}
};
void print(const vector<int>& nums) {
std::cout << "vector: {";
int i = 0;
size_t cnt = nums.size();
for (auto& it : nums) {
i++;
if (i == cnt) {
std::cout << it;
}
else {
std::cout << it << ",";
}
if (i % 10 == 0 && i != cnt) {
std::cout << std::endl;
}
}
std::cout << "}" <<std::endl;
}
void print(const vector<Student>& st) {
std::cout << "vector: {" <<std::endl;
int i = 0;
size_t cnt = st.size();
for (auto& it : st) {
i++;
if (i == cnt) {
std::cout << "{"<<it.number << ", " << it.name << ", " << it.score << "\t}" <<std::endl;
}
else {
std::cout << "{" << it.number << ", " << it.name << ", " << it.score << "\t}," << std::endl;
}
}
std::cout << "}" << std::endl;
}
void sort1() {
std::vector<int> nums = { 5,4,1,2,3,4,5,6,7,8 };
std::cout << "Before sort Number:" << std::endl;
print(nums);
//默认从小到大排序
std::sort(nums.begin(), nums.end());
std::cout << "After sort Number:" << std::endl;
print(nums);
}
void sort2() {
std::vector<int> nums = { 5,4,1,2,3,4,5,6,7,8 };
std::cout << "Before sort Number:" << std::endl;
print(nums);
//指定从大到小排序
std::sort(nums.begin(), nums.end(), std::greater<int>());
std::cout << "After sort Number:" << std::endl;
print(nums);
}
void sort3() {
std::vector<Student> students = { {1,"张一",83.5},{2,"张二",89.5},{3,"张三",79.5},{4,"张四",89.5},
{5,"张五",85}, {6,"张六",85}, {7,"张七",88}, {8,"张八",100} };
std::cout << "Before sort Student:" << std::endl;
print(students);
//通过重载'<'操作符,按学生分数从高到底排序
std::sort(students.begin(), students.end());
std::cout << "After sort Student:" << std::endl;
print(students);
}
void sort4() {
std::vector<Student> students = { {1,"张一",83.5},{2,"张二",89.5},{3,"张三",79.5},{4,"张四",89.5},
{5,"张五",85}, {6,"张六",85}, {7,"张七",88}, {8,"张八",100} };
std::cout << "Before sort Student:" << std::endl;
print(students);
//通过比较函数compare,按学生分数从高到底排序
std::sort(students.begin(), students.end(),Student::compare);
std::cout << "After sort Student:" << std::endl;
print(students);
}
void sort5() {
std::vector<Student> students = { {1,"张一",83.5},{2,"张二",89.5},{3,"张三",79.5},{4,"张四",89.5},
{5,"张五",85}, {6,"张六",85}, {7,"张七",88}, {8,"张八",100} };
std::cout << "Before sort Student:" << std::endl;
print(students);
///局部排序, 按学生分数从高到底排序,只获取前三名
std::partial_sort(students.begin(), students.begin()+3, students.end(),Student::compare);
std::cout << "After sort Student:" << std::endl;
print(students);
}
int main(int argc, char** argv)
{
std::cout << "默认从小到大排序,sort1()" << std::endl;
sort1();
std::cout << std::endl;
std::cout << "指定从大到小排序,sort2()" << std::endl;
sort2();
std::cout << std::endl;
std::cout << "通过重载'<'操作符,按学生分数从高到底排序,sort3()" << std::endl;
sort3();
std::cout << std::endl;
std::cout << "通过比较函数compare,按学生分数从高到底排序,sort4()" << std::endl;
sort4();
std::cout << std::endl;
std::cout << "按学生分数从高到底排序,只获取前三名,sort5()" << std::endl;
sort5();
std::cout << std::endl;
return 0;
}
运行结果:
默认从小到大排序,sort1()
Before sort Number:
vector: {5,4,1,2,3,4,5,6,7,8}
After sort Number:
vector: {1,2,3,4,4,5,5,6,7,8}
指定从大到小排序,sort2()
Before sort Number:
vector: {5,4,1,2,3,4,5,6,7,8}
After sort Number:
vector: {8,7,6,5,5,4,4,3,2,1}
通过重载'<'操作符,按学生分数从高到底排序,sort3()
Before sort Student:
vector: {
{1, 张一, 83.5 },
{2, 张二, 89.5 },
{3, 张三, 79.5 },
{4, 张四, 89.5 },
{5, 张五, 85 },
{6, 张六, 85 },
{7, 张七, 88 },
{8, 张八, 100 }
}
After sort Student:
vector: {
{8, 张八, 100 },
{2, 张二, 89.5 },
{4, 张四, 89.5 },
{7, 张七, 88 },
{5, 张五, 85 },
{6, 张六, 85 },
{1, 张一, 83.5 },
{3, 张三, 79.5 }
}
通过比较函数compare,按学生分数从高到底排序,sort4()
Before sort Student:
vector: {
{1, 张一, 83.5 },
{2, 张二, 89.5 },
{3, 张三, 79.5 },
{4, 张四, 89.5 },
{5, 张五, 85 },
{6, 张六, 85 },
{7, 张七, 88 },
{8, 张八, 100 }
}
After sort Student:
vector: {
{8, 张八, 100 },
{2, 张二, 89.5 },
{4, 张四, 89.5 },
{7, 张七, 88 },
{5, 张五, 85 },
{6, 张六, 85 },
{1, 张一, 83.5 },
{3, 张三, 79.5 }
}
按学生分数从高到底排序,只获取前三名,sort5()
Before sort Student:
vector: {
{1, 张一, 83.5 },
{2, 张二, 89.5 },
{3, 张三, 79.5 },
{4, 张四, 89.5 },
{5, 张五, 85 },
{6, 张六, 85 },
{7, 张七, 88 },
{8, 张八, 100 }
}
After sort Student:
vector: {
{8, 张八, 100 },
{2, 张二, 89.5 },
{4, 张四, 89.5 },
{3, 张三, 79.5 },
{1, 张一, 83.5 },
{6, 张六, 85 },
{5, 张五, 85 },
{7, 张七, 88 }
}