这里有C++STL——全面总结详细教程(附案例解析)(持续更新中)
常用排序算法
学习目标:
-
掌握常用的排序算法
算法简介:
sort
//对容器内元素进行排序random_shuffle
//洗牌 指定范围内的元素随机调整次序merge
// 容器元素合并,并存储到另一容器中reverse
// 反转指定范围的元素
sort
功能描述:
-
对容器内元素进行排序
函数原型:
sort(iterator beg, iterator end, _Pred);
- // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
- // beg 开始迭代器
- // end 结束迭代器
- // _Pred 谓词
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
void MyPrint(int val) {
cout << val << " ";
}
void test01(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(4);
v.push_back(5);
v.push_back(3);
v.push_back(4);
v.push_back(4);
sort(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
sort(v.begin(), v.end(), greater<int>());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
random_shuffle
功能描述:
-
洗牌 指定范围内的元素随机调整次序
函数原型:
random_shuffle(iterator beg, iterator end);
- // 指定范围内的元素随机调整次序
- // beg 开始迭代器
- // end 结束迭代器
#include<iostream>
#include<vector>
#include<string>
#include<ctime>
#include<algorithm>
using namespace std;
void MyPrint(int val) {
cout << val << " ";
}
void test01(){
srand((unsigned int)time(NULL));
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:random_shuffle洗牌算法比较实用,使用时记得加随机数种子。
接下来把合并与反转放在一起讲解。
merge
功能描述:
-
两个容器元素合并,并存储到另一容器中
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
- // 容器元素合并,并存储到另一容器中
- // 注意: 两个容器必须是有序的
- // beg1 容器1开始迭代器// end1 容器1结束迭代器// beg2 容器2开始迭代器// end2 容器2结束迭代器// dest 目标容器开始迭代器
reverse
功能描述:
-
将容器内元素进行反转
函数原型:
-
reverse(iterator beg, iterator end);
// 反转指定范围的元素
// beg 开始迭代器
// end 结束迭代器
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class MyPrint {
public:
void operator()(int val){
cout << val << " ";
}
};
void test01(){
vector<int>v;
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
v1.push_back(i + 1);
}
vector<int>vTarget;
vTarget.resize(v.size() + v1.size());
merge(v.begin(), v.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
reverse(vTarget.begin(), vTarget.end());
for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:merge合并的两个容器必须的有序序列。
注意:合并前。我们必须先给新容器分配大小。