【C++ STL】排序算法

排序算法

排序算法是 <algorithm> 头文件的核心功能,基于高效的排序思想实现,能覆盖绝大多数排序场景。

! 注意

list容器需要使用本身的sort函数进行排序;

set和map容器本省有序,不需要进行排序操作。

通用全量排序

std::sort(相等元素可能会产生位置变化)

默认升序排序,可以自定义排序规则。关键点:随机访问迭代器 (支持 []/+= 操作),因此不支持 list/forward_list。

对象排序需要重载/<运算符

细节:

  • 初始用快速排序,递归深度超过 2logn 时切堆排序(避免快排最坏 O (n²));
  • 无额外空间开销(原地排序)。
  • 子数组长度 < 16 时切插入排序(小数据插排效率更高);
c++ 复制代码
vector<int> v = { 7, 5, 6, 8, 4, 2, 1 };

// 默认排序规则,升序排列
sort(v.begin(), v.end());
	
for (int i : v)
{
	cout << i << " ";		// 1 2 4 5 6 7 8
}
cout << endl;

基础数据类型指定降序排序方法1

c++ 复制代码
vector<int> v = { 7, 5, 6, 8, 4, 2, 1 };

// 基础数据类型指定降序排列
sort(v.begin(), v.end(), greater<int>());
	
for (int i : v)
{
	cout << i << " ";		// 8 7 6 5 4 2 1
}
cout << endl;

基础数据类型指定降序排序方法2

c++ 复制代码
bool comInt(int a, int b)
{
	return a > b;
}

int main()
{
	vector<int> v = { 7, 5, 6, 8, 4, 2, 1 };

	// 基础数据类型指定降序排列,自定义排序函数
	sort(v.begin(), v.end(), comInt);
	
	for (int i : v)
	{
		cout << i << " ";		// 8 7 6 5 4 2 1
	}
	cout << endl;

	return EXIT_SUCCESS;
};

基础数据类型指定降序排序方法3

c++ 复制代码
vector<int> v = { 7, 5, 6, 8, 4, 2, 1 };

// 基础数据类型指定降序排列,lambda表达式
sort(v.begin(), v.end(), [](int a, int b) {return a > b; });
	
for (int i : v)
{
	cout << i << " ";		// 8 7 6 5 4 2 1
}
cout << endl;

对象排序方法1,重载<运算符

c++ 复制代码
class Person {
public:
	Person(int id, string name)
	{
		this->id = id;
		this->name = name;
	}

	bool operator<(const Person& p)
	{
		// 如果按照id倒序排序,这里只需要改成return this->id > p.id;
		return this->id > p.id;
	}

public:
	int id;
	string name;
};

int main()
{
	vector<Person> v;
	v.push_back(Person(1, "zs"));
	v.push_back(Person(2, "ls"));
	v.push_back(Person(3, "wz"));

	
	sort(v.begin(), v.end());
	
	for (Person p : v)
	{
		cout << p.name << " ";		// 8 7 6 5 4 2 1
	}
	cout << endl;

	return EXIT_SUCCESS;
};

对象排序方法2,使用lambda表达式

c++ 复制代码
vector<Person> v;
v.push_back(Person(1, "zs"));
v.push_back(Person(2, "ls"));
v.push_back(Person(3, "wz"));

	
sort(v.begin(), v.end(), [](const Person& p1, const Person& p2) {
	return p1.id > p2.id;
	});
	
for (Person p : v)
{
	cout << p.name << " ";		// 8 7 6 5 4 2 1
}
cout << endl;
stable_sort(保留相等元素顺序)

细节:

  • 基于归并排序,需要 O (n) 额外空间(若内存不足会退化为 O (n log n) 时间 + O (1) 空间,但效率略降);
  • 相等元素的相对位置完全保留。
    使用方法和sort相同

部分排序

不需要全量排序,只需要「前 k 个最小 / 最大元素」,比全排序更高效(时间复杂度 O (n log k))。

std::partial_sort 前 k 个元素有序,剩余无序
std::partial_sort_copy 排序后拷贝到新容器,适用于原容器不可修改,需输出到新容器

特殊容器排序

std::set/std::map,底层使用红黑树默认排序升序,可以在定义时指定排序规则;

unordered_set/unordered_map,底层使用hash表无序,可以转存到vector后进行排序;

结束语

  • 通用排序 :优先用 std::sort(高效),需稳定性用 stable_sort,链表用 list::sort
  • 部分排序 :仅需前 k 个元素用 partial_sort,比全排序更高效;
  • 自定义规则:用 lambda 表达式,严格遵守「严格弱序」(只用 </>,不用 <= />=);
  • 特殊容器:set/map 定义时指定排序规则,无序容器转 vector 后排序。
相关推荐
Dxy12393102168 分钟前
Python使用XPath定位元素:动态计算与函数调用
开发语言·python
小柯博客12 分钟前
STM32MP2安全启动技术深度解析
c语言·c++·stm32·嵌入式硬件·安全·开源·github
cpp_250120 分钟前
P1832 A+B Problem(再升级)
数据结构·c++·算法·动态规划·题解·洛谷·背包dp
Evand J21 分钟前
【MATLAB代码介绍】三种CT模型的IMM(交互式多模型)对目标高精度定位
开发语言·matlab·ct·imm·交互式多模型·多模型·转弯
AC赳赳老秦24 分钟前
OpenClaw权限管理实操:团队共享Agent,设置操作权限,保障数据安全
服务器·开发语言·前端·javascript·excel·deepseek·openclaw
geovindu36 分钟前
go: Proxy Pattern
开发语言·后端·设计模式·golang·代理模式
langsiming41 分钟前
【无标题】
java·开发语言·数据库
꧁细听勿语情꧂42 分钟前
合并两个有序表、判断链表的回文结构、相交链表、环的链表一和二
c语言·开发语言·数据结构·算法
Rust语言中文社区44 分钟前
【Rust日报】2026-04-24 Vizia 0.4 发布——纯 Rust 声明式响应式 GUI 框架
开发语言·后端·rust
结衣结衣.1 小时前
手把手教你实现文档搜索引擎
linux·c++·搜索引擎·开源·c++11