C++全排列中递归交换法怎么用
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,今天小编给大家分享一下C++全排列中递归交换法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
千家信息网最后更新 2025年11月13日C++全排列中递归交换法怎么用
今天小编给大家分享一下C++全排列中递归交换法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数n。
输出格式
由1~n组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5个场宽。
输入样例
3
输出样例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
全排列问题--递归交换法
其实跟暴力枚举思路差不多,每次递归枚举第x个数字是几,之后a[x]可以选择不动,也可以选择与后面任意一个数交换位置,就是从后面选一个数放到x的位置上。
简而言之,就是每到一位就从后面选一个尚未被使用过的数字与该位数字交换,这里有些难理解,您可以自己按照程序推一下样例。
这样我们就可以打印所有的全排列了,但这样不是按顺序打印,所以这里需要每次对a[x] ~ a[n]进行排序。
举个例子,如对1、2、3进行全排列。当我们交换1和3后,序列变为3、2、1,如果说这里不排序,直接2、1都保持不动,就输出3、2、1了,可是我们先要的应该是3、1、2,所以要进行排序。
最后,算一下时间复杂度,我们发现需要从1到n一位一位的看,之后每位还要枚举x ~ n,所以总时间复杂度为O(n!)。
代码
# include# include # include # include using namespace std;const int N_MAX = 10;int n;int a[N_MAX + 10];void permutation(int x){ if (x == n) { for (int i = 1; i <= n; i++) printf("%5d", a[i]); printf("\n"); return; } for (int i = x; i <= n; i++) { sort(a + x, a + n + 1); swap(a[x], a[i]); permutation(x + 1); swap(a[x], a[i]); }}int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++) a[i] = i; permutation(1); return 0;}
以上就是"C++全排列中递归交换法怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
数字
递归
序列
知识
篇文章
输出
排序
C++
复杂
个数
位置
内容
复杂度
就是
时间
格式
输入
选择
不同
很大
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云桌面与服务器区别
IP筛选数据库
网络安全三个重要组成
铁警网络安全与执法就业方向
幻塔服务器爆炸12月16
忘记网络安全密码怎么办
吴江区方便软件开发专业服务
网络安全模式启动很慢
重庆邮电大学网络安全调剂
网络安全法体会300
程序员怎么打开数据库
数据库怎么收集
软件开发管理包括
宇信科技布局互联网小贷
应用下载服务器维护要多久
主流网站数据库有哪些
在温氏集团做软件开发好吗
lol服务器怎么选楼
菏泽有软件开发的学校吗
互联网没什么科技技术
车载网络技术考试题库
供应商管理软件开发
pyqt5数据库程序实例
中学校园网络安全检查表
吉大数据库应用技术在线作业
数据库应用技术期末考试卷
吕梁gpu服务器找哪家
江汉区剧院票务系统软件开发
山东省浪潮存储服务器哪里有
数据库安全码