5.3 常用排序算法
1、学习目标:
- 掌握常用的排序算法
2、算法简介:
- sort //对容器内元素进行排序
- random_shuffle //洗牌 指定范围内的元素随机调整次序
- merge //容器元素合并,并存储到另一容器中
- reverse //反转指定范围的元素
5.3.1 sort
1、功能描述:
- 对容器内元素进行排序
2、 函数原型:
- sort(iterator beg,iterator end,_Pred);
- //按条件排序
- //beg开始迭代器
- //end结束迭代器
- //_Pred谓词
3、代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<functional>
class Great20
{
public:
bool operator()(int val1,int val2)
{
if (val1 > val2)return true;
else return false;
}
};
void MyPrint(int val)
{
cout << val << " ";
}
//统计内置数据类型
void test01()
{
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(50);
v.push_back(20);
v.push_back(40);
//利用sort进行升序
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;
//sort(v.begin(), v.end(),Great20());老方法
}
int main()
{
test01();
system("pause");
return 0;
}
4、总结:
- sort属于开发中最常用的算法之一,需要熟练掌握
5、运行结果
5.3.2 random_shuffle
1、功能描述:
- 指定范围内的元素随机调整次序
2、函数原型:
- srandom_shuffle(iterator beg,iterator end);
- //按条件排序
- //beg开始迭代器
- //end结束迭代器
3、代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<functional>
#include<ctime>
void MyPrint(int val)
{
cout << val << " ";
}
void test01()
{
vector<int>v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//利用洗牌算法 打乱顺序
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main()
{
srand((unsigned int)time(NULL));
test01();
//test02();
system("pause");
return 0;
}
4、 总结:
- random_shuffle洗牌算法比较实用,使用时记得加随机数种子
5、运行结果
5.3.2 merge
1、功能描述:
- 容器元素合并,并存储到另一容器中
2、函数原型:
- merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
- //容器元素合并,并存储到另一容器中
- //两个容器必须是有序的
- //beg1容器1开始迭代器
- //end1容器1结束迭代器
- //beg2容器2开始迭代器
- //end2容器2结束迭代器
- //dest目标容器开始迭代器
3、代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<functional>
void MyPrint(int val)
{
cout << val << " ";
}
//常用排序算法 merge
void test01()
{
vector<int>v1;
vector<int>v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i+1);
}
//目标容器
vector<int>vTarget;
//提前给目标容器分配空间
vTarget.resize(v1.size()+v2.size());
merge(v1.begin(), v1.end(),v2.begin(),v2.end(),vTarget.begin());
for_each(vTarget.begin(), vTarget.end(), MyPrint);
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
4、 总结:
- merge合并的两个容器必须是有序序列
5、运行结果
5.3.2 reverse
1、功能描述:
- 反转指定范围的元素
2、函数原型:
- merge(iterator beg,iterator end);
- //反转指定范围的元素
- //beg 开始迭代器
- //end 结束迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
#include<functional>
void MyPrint(int val)
{
cout << val << " ";
}
//常用排序算法 reverse
void test01()
{
vector<int>v;
v.push_back(10);
v.push_back(30);
v.push_back(50);
v.push_back(20);
v.push_back(40);
cout << "反转前:" << endl;
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
cout << "反转后" << endl;
reverse(v.begin(), v.end());
for_each(v.begin(), v.end(), MyPrint);
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
4、总结:
- reverse反转区间内的元素,面试题可能涉及到
5、运行结果