目录
常用排序算法简介:
- sort 对容器内元素进行排序
- random_shuffle 洗牌,指定范围内的元素随机调整次序
- merge 容器元素合并,并存储到另一个容器中
- reverse 反转指定范围的元素
sort
功能:
- 对容器内元素进行排序
函数原型:
sort(iterator beg, iterator end, _Pred); // _Pred 参数为重载版本
beg —— 开始迭代器
end —— 结束迭代器
_Pred —— 谓词、函数,可以有可以没有,不传入就是默认从小到大
测试代码:
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<string>
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
string m_Name;
int m_Age;
};
class my_sort {
public:
bool operator()(int& value1, int& value2) {
return (value1 > value2);
}
};
class Person_ASCsort {
public:
bool operator()(const Person& p1, const Person& p2) {
return (p1.m_Age < p2.m_Age);
}
};
class Person_DESsort {
public:
bool operator()(const Person& p1, const Person& p2){
return (p1.m_Age > p2.m_Age);
}
};
void localPrint(const int& x) {
cout << x << " ";
}
void PersonPrint(const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
}
// 内置数据类型排序
void test01() {
vector<int>v;
for (int i = 10; i > 0; --i) {
v.push_back(i); // 1 - 10
}
// 升序
cout << "——升序——" << endl;
sort(v.begin(), v.end());
for_each (v.begin(), v.end(), localPrint);
cout << endl;
// 升序
cout << "——降序——" << endl;
sort(v.begin(), v.end(), my_sort());
for_each(v.begin(), v.end(), localPrint);
cout << endl;
}
// 自定义数据类型排序
void test02() {
vector<Person>v;
Person p1("李四", 19);
Person p2("王五", 18);
Person p3("张三", 20);
Person p4("李华", 17);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
cout << "年龄升序" << endl;
sort(v.begin(), v.end(), Person_ASCsort());
for_each(v.begin(), v.end(), PersonPrint);
cout << "年龄降序" << endl;
sort(v.begin(), v.end(), Person_DESsort());
for_each(v.begin(), v.end(), PersonPrint);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
random_shuffle
功能:
- 洗牌:指定范雷内的元素随机调整次序
函数原型:
random_shuffle(iterator beg, iterator end);
beg——开始迭代器
end——结束迭代器
测试代码:
#include<iostream>
using namespace std;
#include<ctime>
#include<vector>
#include<algorithm>
#include<string>
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
string m_Name;
int m_Age;
};
// 重载 << ,输出对象
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
// 输出模板
template<typename T>
void PrintVector(const T& x) {
cout << x;
}
// 内置数据类型洗牌
void test01() {
vector<int>v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for_each(v.begin(), v.end(), PrintVector<int>);
cout << endl;
// 随机排序
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), PrintVector<int>);
cout << endl;
}
// 自定数据类型洗牌
void test02() {
vector<Person>v;
Person p1("李四", 16);
Person p2("王五", 17);
Person p3("李华", 18);
Person p4("张三", 19);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
for_each(v.begin(), v.end(), PrintVector<Person>);
cout << endl;
// 随机排序
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), PrintVector<Person>);
cout << endl;
}
int main() {
srand((unsigned)time(NULL)); // 随机数种子
test01();
test02();
system("pause");
return 0;
}
运行结果:
洗牌算法不能实现每次都是随机,想要每次都是随机的就需要用随机种子(主函数)
srand((unsigned int)time(NULL));
merge
功能:
- 两个容器(有序,升序)元素合并,并存储到另一个容器中(依然是有序的)
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
beg1 —— 容器 1 开始迭代器
end1 —— 容器 1 结束迭代器
beg2 —— 容器 2 开始迭代器
end2 —— 容器 2 结束迭代器
dest —— 目标容器开始迭代器
测试代码:
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<string>
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
Person() :m_Name(" "), m_Age(0) {}
string m_Name;
int m_Age;
};
// 重载 << 输出对象
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
// 输出内置和自定义数据容器元素模板
template<typename T>
void PrintVector(const T& x) {
cout << x << " ";
}
// 内置数据类型合并
void test01() {
vector<int>v1; // 有序
vector<int>v2; // 有序
for (int i = 0; i < 10; i++) {
v1.push_back(i); // 0 - 9
v2.push_back(i); // 0 - 9
}
vector<int>v_target; // 目标容器
v_target.resize(v1.size() + v2.size()); // 目标容器需要给定大小
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin());// 合并
for_each(v_target.begin(), v_target.end(), PrintVector<int>); // 遍历目标容器
cout << endl;
}
// 排序仿函数
class my_sort {
public:
bool operator()(const Person& p1, const Person& p2) {
return (p1.m_Age < p2.m_Age);
}
};
// 自定义数据类型合并
void test02() {
vector<Person>v1; // 有序
vector<Person>v2; // 有序
Person p1("李四", 19);
Person p2("王五", 18);
Person p3("张三", 20);
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
v2.push_back(p1);
v2.push_back(p2);
v2.push_back(p3);
sort(v1.begin(), v1.end(), my_sort());
sort(v2.begin(), v2.end(), my_sort());
vector<Person>v_target; // 目标容器
v_target.resize(v1.size() + v2.size()); // 目标容器给定大小
// 合并,这个里面也要传入排序方法仿函数
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v_target.begin(), my_sort());
for_each(v_target.begin(), v_target.end(), PrintVector<Person>); // 遍历
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
目标容器需要提前给定大小,前面两个容器数据顺序必须一致(升序)
reverse
功能:
- 将容器内元素反转
函数原型:
reverse(iterator beg, iterator end);
beg——开始迭代器
end——结束迭代器
测试代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class Person {
public:
Person(string name, int age) :m_Name(name), m_Age(age) {}
string m_Name;
int m_Age;
};
// 重载 << 输出对象
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.m_Name << " " << p.m_Age << endl;
return cout;
}
// 输出 vector 模板函数
template<typename T>
void PrintVector(const T& x) {
cout << x;
}
// 反转内置数据类型容器
void test01() {
vector<int>v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
cout << "——反转前——" << endl;
for_each(v.begin(), v.end(), PrintVector<int>);
cout << endl;
cout << "——反转后——" << endl;
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), PrintVector<int>);
cout << endl;
}
// 反转自定义数据类型容器
void test02() {
vector<Person>v;
Person p1("张三", 18);
Person p2("李四", 19);
Person p3("王五", 20);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
cout << "——反转前——" << endl;
for_each(v.begin(), v.end(), PrintVector<Person>);
cout << "——反转后——" << endl;
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), PrintVector<Person>);
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行结果:
降序改为升序直接 reverse 一下就可以了