algorithm 排序操作

这篇博客详细介绍了C++ STL中的排序算法,包括sort、partial_sort、nth_element、merge和includes函数的使用方法及应用场景,帮助读者理解如何在C++中进行高效的排序操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法

排序算法的特点是对容器的内容进行不同方式的排序,例如 Sort()。

函数算法
binary_search(first, last, val)二元搜索
equal_range(first, last, val)判断是否相等,并返回一个区间
includes(first, last, first2, last2)包含与
lexicographical_compare(first, last, first2, last2)以字典排序方式做比较
lower_bound(first, last, val)下限
make_heap(first, last)制造一个 heap
max(val1, val2)最大值
max_element(first, last)最大值所在位置
merge(first, last, first2, last2, result)合并两个序列
min(val1, val2)最小值
min_element(first, last)最小值所在位置
next_permutation(first, last)获得下一个排列组合
nth_element(first, nth, last)重新排序列中第 n 个元素的左右两端
partial_sort_copy(first, last, first2, last2)局部排序并复制到其他位置
partial_sort(first, middle, last)局部排序
pop_heap(first, last)从 heap 内取出一个元素
prev_permutation(first, last)改变迭代器 first 和 last 指明范围内的元素排序,使新排列是下一个比原排列小的排列,此函数的另一个版本以谓词作为第 3 个实参
push_heap(first, last)将一个元素压入 heap
set_difference(first, last, first2, last2, result)获得前一个排列组合
set_intersection(first, last, first2, last2, result)交集
set_symmetric_difference(first, last, first2, last2, result)差集
set_union(first, last, first2, last2, result)联集
sort(first, last)排序
sort_heap(first, last)对 heap 排序
stable_sort(first, last)排序并保持等值元素的相对次序
upper_bound(first, last, val)上限

sort(first, last)

对迭代器 first 和 last 指明范围内的元素排序。此函数的另一个版本以谓词作为第 3 个参数。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_sort()
{
	vector<int> int_vector;
	for (size_t i = 0; i < 10; i++) int_vector.push_back(i);
	random_shuffle(int_vector.begin(), int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;

	sort(int_vector.begin(), int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;
}
Output
Vector:8 1 9 2 0 5 7 3 4 6
Vector:0 1 2 3 4 5 6 7 8 9

partial_sort(first, middle, last)

对迭代器 first 和 last 指明范围内的元素进行排序,把排序后的前一部分元素放至序列的前一部分(由 first 和 middle 指明的范围),其余元素放在后一部分(由 middle 和 last 指明的范围)。此函数的另一版本以谓词作为第 4 个实参。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_partial_sort()
{
	vector<int> int_vector;
	for (size_t i = 0; i < 10; i++) int_vector.push_back(i);
	random_shuffle(int_vector.begin(), int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;

	// 只替换排序后前5个元素
	partial_sort(int_vector.begin(), int_vector.begin() + 5, int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;
}
Output
Vector:8 1 9 2 0 5 7 3 4 6
Vector:0 1 2 3 4 9 8 7 5 6

nth_element(first, nth, last)

在迭代器 first 和 last 指明范围的已排序元素中查找 val。如果找到值为 val 的元素,返回 true, 否则返回 false 值。此函数的另一个版本以谓词作为第 4 个实参。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_nth_element()
{
	vector<int> int_vector;
	for (size_t i = 0; i < 50; i++) int_vector.push_back(i);
	random_shuffle(int_vector.begin(), int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;

	nth_element(int_vector.begin(), int_vector.begin() + 5, int_vector.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;
}
Output
Vector:34 49 17 26 21 44 35 32 20 33 41 19 48 45 3 5 6 22 14 13 23 29 39 28 46 8 2 10 25 36 4 38 27 9 7 40 1 31 47 18 11 37 24 30 0 15 12 16 42 43
Vector:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 41 33 32 40 44 49 47 34 46 37 39 35 45 36 48 38 42 43

merge(first, last, first2, last2, result)

把从 first 到 last 指明范围内的已排序元素与 first2 和 last2 指明范围内的已排序元素合并,并把重新排序后的元素放在从 result 开始的序列中。此函数的另一版本以谓词作为第 6 个实参。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_merge()
{
	vector<int> int_vector;
	for (size_t i = 0; i < 10; i++) int_vector.push_back(rand());
	sort(int_vector.begin(), int_vector.end());
	vector<int> int_vector2;
	for (size_t i = 0; i < 10; i++) int_vector2.push_back(rand());
	sort(int_vector2.begin(), int_vector2.end());

	cout << "Vector1:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;
	cout << "Vector2:";
	for (int item : int_vector2) cout << item << ' ';
	cout << endl;

	vector<int> result(int_vector.size() + int_vector2.size());
	// 合并必须是排序后的序列
	merge(int_vector.begin(), int_vector.end(), int_vector2.begin(), int_vector2.end(), result.begin());

	cout << "Vector3:";
	for (int item : result) cout << item << ' ';
	cout << endl;
}
Output
Vector1:41 6334 11478 15724 18467 19169 24464 26500 26962 29358
Vector2:491 2995 4827 5436 5705 9961 11942 16827 23281 28145
Vector3:41 491 2995 4827 5436 5705 6334 9961 11478 11942 15724 16827 18467 19169 23281 24464 26500 26962 28145 29358

includes(first, last, first2, last2)

在迭代器 first 和 last 指明的范围内,如果含有一个用 first2 和 last2 指明范围的已排序序列,则返回 true 值。此函数的另一个版本以谓词作为第 5 个实参。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void Test_includes()
{
	vector<int> int_vector{ 2,5,12,1,53,13,23,21,3,6,7,8,8 };
	sort(int_vector.begin(), int_vector.end());

	vector<int> int_vector2{ 8,6,7,8 };
	sort(int_vector2.begin(), int_vector2.end());

	cout << "Vector:";
	for (int item : int_vector) cout << item << ' ';
	cout << endl;

	cout << "是否包含:[6,7,8,8]" << endl;

	// 必须是排序后的序列
	bool is_includes = includes(int_vector.begin(), int_vector.end(), int_vector2.begin(), int_vector2.end());
	cout << "结果:" << (is_includes ? "包含" : "不包含");
}
Output
Vector:1 2 3 5 6 7 8 8 12 13 21 23 53
是否包含:[6,7,8,8]
结果:包含

相关参考

微软文档

cppreference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值