天天看点

C++ STL(十四):常用排序算法(sort、random_shuffle、merge、reverse)0 常用排序算法简介【sort、random_shuffle、merge、reverse】1 sort【对容器元素排序】2 random_shuffle【洗牌:对指定范围的容器元素随机排序】3 merge【合并两个容器的元素,并存储至新容器中】4 reverse【反转容器元素】

文章目录

  • 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;
}
           

继续阅读