讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

c++如何实现全排列_c++ next_permutation算法详解【进阶】

胖杰同学_2451

胖杰同学_2451

发布时间:2026-02-12 09:23:02

|

742人浏览过

|

来源于php中文网

原创

next_permutation是C++标准库中生成字典序下一个排列的函数,需先排序才能遍历全部不重复排列;它通过找降序后缀、交换、翻转实现,支持自定义比较但要求严格弱序。

c++如何实现全排列_c++ next_permutation算法详解【进阶】

next_permutation 是什么,它到底在做什么

next_permutation 是 C++ 标准库 <algorithm></algorithm> 中的一个函数,它对给定的序列(比如 vector 或数组)按字典序生成「下一个」排列。它不枚举全部,只负责从当前状态推进到字典序紧邻的下一个有效排列;如果当前已是最大排列(如降序),则返回 false 并将序列重置为最小排列(升序)。

它不是递归实现,也不分配额外空间,时间复杂度均摊 O(1),最坏 O(n),核心是「找最长后缀降序段 → 找后缀中首个大于前驱的元素 → 交换 + 翻转后缀」。

为什么直接用 next_permutation 前必须先排序

因为 next_permutation 只保证「字典序递增」,不保证从全排列集合的第一个开始。如果输入是乱序(如 {3,1,2}),调用一次 next_permutation 会跳到 {3,2,1},直接漏掉 {1,2,3}、{1,3,2}、{2,1,3} 等前面所有排列。

  • 正确做法:先用 sort(v.begin(), v.end()) 把容器排成升序(即字典序最小排列)
  • 然后在一个 do-while 循环里调用 next_permutation,确保覆盖全部 n! 种
  • 错误写法:while (next_permutation(...)) { ... } 会漏掉初始状态

示例:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
vector<int> v = {3, 1, 2};
sort(v.begin(), v.end()); // → {1,2,3}
do {
    // 处理 v
} while (next_permutation(v.begin(), v.end())); // 共执行 6 次

next_permutation 对自定义类型或结构体怎么用

它依赖 operator,所以自定义类型必须提供可比较的严格弱序关系。不能只靠成员变量数量一致就认为可排列——缺少比较逻辑会导致行为未定义(可能无限循环或提前退出)。

  • 确保类/结构体重载了 bool operator
  • 或者传入自定义比较函数对象: next_permutation(it1, it2, comp)
  • 注意:比较函数必须满足严格弱序,禁止用 或随机逻辑
  • 常见翻车点:结构体里有浮点字段,直接用 比较可能因精度导致排序不稳定

例如:

struct Point {
    int x, y;
    bool operator<(const Point& o) const {
        return x != o.x ? x < o.x : y < o.y;
    }
};

性能陷阱:重复元素时 next_permutation 还能用吗

能用,但结果不是「去重全排列」——next_permutation 本身不判重,它把相等元素也视为不同位置的独立个体。若输入含重复值(如 {1,1,2}),它仍会生成全部 3! = 6 个排列,其中 {1,1,2} 和 {1,1,2}(两 1 交换)被算作两个不同排列。

  • 想得到真正去重的排列?必须先 sort,再用 next_permutation,它内部已处理重复:当后缀中存在相同元素时,交换和翻转会自然跳过等价排列
  • 验证方式:对 {1,1,2} 排序后调用,实际只生成 3 个不同结果({1,1,2}, {1,2,1}, {2,1,1})
  • 但前提是容器已有序;如果乱序传入,重复逻辑失效,结果不可预测

真正容易被忽略的是:它的去重能力完全依赖于「输入已排序」+「元素可比较」这两个前提,缺一不可。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1158

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2458

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5454

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5631

2025.07.04

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

7116

2023.08.14

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

40

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn