文章目录
- 0 常用排序算法简介【sort、random_shuffle、merge、reverse】
- 1 sort【对容器元素排序】
- 2 random_shuffle【洗牌:对指定范围的容器元素随机排序】
- 3 merge【合并两个容器的元素,并存储至新容器中】
- 4 reverse【反转容器元素】
0 常用排序算法简介【sort、random_shuffle、merge、reverse】
算法简介:sort
:对容器元素排序。random_shuffle
:对指定范围的容器元素随机排序,即洗牌。merge
:合并两个容器的元素,并存储至新容器中。reverse
:反转的容器元素。
1 sort【对容器元素排序】
作用:对容器元素排序。
注:使用
sort
算法时,需包含头文件include <algorithm>
。
函数原型:sort(iterator begin, iterator end, _Pred);
参数解释:begin
:迭代器起始位置;end
:迭代器结束位置;_Pred
:可选项,默认升序排序;可指定自定义排序规则。
①普通回调函数;
②谓词(返回类型为bool
的仿函数);
③匿名函数(lambda表达式)。
④内建函数对象/关系仿函数(bool greater<T>
或bool less<T>
)。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用sort算法
//回调函数
bool myCompare(int val1, int val2) {
return val1 > val2;
}
//函数对象/仿函数
class MyCompare {
public:
//重载函数调用运算符()
bool operator()(int val1, int val2) {
return val1 > val2;
}
};
//sort排序
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
//默认升序排序
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //1 3 6 7 9
/* 降序排序 */
//1.回调函数实现降序排序
sort(v.begin(), v.end(), myCompare);
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 7 6 3 1
//2.仿函数实现降序排序
sort(v.begin(), v.end(), MyCompare());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 7 6 3 1
//3.匿名函数(lambda表达式)实现降序排序
sort(v.begin(), v.end(), [](int val1, int val2) {return val1 > val2; });
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 7 6 3 1
//4.内建函数对象实现降序排序
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 7 6 3 1
return 0;
}
2 random_shuffle【洗牌:对指定范围的容器元素随机排序】
作用:对指定范围的容器元素随机排序,即洗牌。
注1:使用
random_shuffle
算法时,需包含头文件include <algorithm>
。
注2:为保证随机性,需包含头文件include <ctime>
,添加随机数种子srand((unsigned int)time(NULL));
。
函数原型:random_shuffle(iterator begin, iterator end);
参数解释:begin
:迭代器起始位置;end
:迭代器结束位置;
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用sort算法
#include <ctime> //添加随机数种子
int main() {
//添加随机数种子
srand((unsigned int)time(NULL));
vector<int> v;
for (int i = 0; i < 10; i++) {
v.push_back(i);
}
//0 1 2 3 4 5 6 7 8 9
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
//洗牌算法
random_shuffle(v.begin(), v.end());
//随机排序:6 9 1 4 3 2 0 5 7 8
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
return 0;
}
3 merge【合并两个容器的元素,并存储至新容器中】
作用:合并两个容器的元素,并存储至新容器中。
注1:使用
merge
算法时,需包含头文件include <algorithm>
。
注2:使用merge
算法时,两个源容器的元素必须有序且顺序一致,合并后,新容器中的元素仍有序。
注3:使用merge
算法时,需为目标容器提前开辟内存空间,如dest.resize(src1.size() + src2.size());
,否则程序运行时崩溃。
函数原型:merge(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);
参数解释:begin1
:源容器1迭代器的起始位置;end1
:源容器1迭代器的结束位置;begin2
:源容器2迭代器的起始位置;end2
:源容器2迭代器的结束位置;dest
:目标容器迭代器的起始位置。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用merge算法
int main() {
//合并的两个源容器必须有序,且顺序一致
vector<int> src1;
for (int i = 0; i < 5; i++) {
src1.push_back(i);
}
vector<int> src2;
for (int i = 5; i < 10; i++) {
src2.push_back(i);
}
//合并前,需为目标容器提前分配内存空间
vector<int> dest;
dest.resize(src1.size() + src2.size());
//merge合并
merge(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
//0 1 2 3 4 5 6 7 8 9
for_each(dest.begin(), dest.end(), [](int val) {cout << val << " "; });
return 0;
}
4 reverse【反转容器元素】
作用:反转容器元素。
注:使用
reverse
算法时,需包含头文件include <algorithm>
。
函数原型:reverse(iterator begin, iterator end);
参数解释:begin
:迭代器起始位置;end
:迭代器结束位置;
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> //使用reverse算法
int main() {
vector<int> v;
v.push_back(9);
v.push_back(1);
v.push_back(7);
v.push_back(6);
v.push_back(3);
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //9 1 7 6 3
//反转容器的元素
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), [](int val) {cout << val << " "; }); //3 6 7 1 9
return 0;
}