C++ STL(十四):常用排序算法(sort、random_shuffle、merge、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;
}

猜你喜欢

转载自blog.csdn.net/newson92/article/details/114242778