生成排列 --- 蛮力法,Johnson-Trotter算法
生成排列 --- 蛮力法,Johnson-Trotter算法
- 蛮力法
- Johnson-Trotter算法
蛮力法
- 思路:
通过递归遍历所有的排列方式。 - 代码演示:
#include <iostream>
using namespace std;
const int MAXSIZE = 100;
int n;
int arr[MAXSIZE];
int visit[MAXSIZE];
int x = 0;int recursion(int m)//已经排了m个数
{if (n == m)//已经排了n个数{for (int i = 0; i < n; i++){cout << arr[i] << " ";//输出}cout << endl;}else{for (int i = 1; i <= n; i++){if (visit[i] == 0){visit[i] = 1;//标记已选择arr[x++] = i;//将i放进arr数组recursion(m + 1);//标记已经排了m+1个数//回溯x--;visit[i] = 0;}}}return 0;
}int main()
{memset(arr, 0, sizeof(arr));memset(visit, 0, sizeof(visit));cout << "请输入n的值:";cin >> n;recursion(0);return 0;
}
- 运行结果:
Johnson-Trotter算法
- 思路:
对于任一一个包含n个不同元素的序列a1,a2,a3…an,通过不断地交换相邻的元素可以得到这个序列的全部排列。算法要用到两个辅助序列c1,c2,c3…cn(cj表示在aj的右侧小于aj的元素的数目,满足0<=cj<j)和o1,o2,o3…on(oj控制cj改变的方向)。
- 初始化:cj=0;oj=1,其中1<=j<=n;
- 访问序列a1,a2,a3…an。
- 令j=n,s=0.s表示排满足k>j且ck=k-1的ck的个数。
- 令q=cj+oj;如果q<j,执行步骤7;如果q=j,执行步骤6.
- 交换a[j-cj+s]和a[j-q+s],令cj=q,执行步骤2.
- 若j=1,结束算法;否则令s=s+1;
- 令oj=-oj,j=j-1,重复步骤4.
- 代码演示:
#include <iostream>
using namespace std;
const int MAXSIZE = 100;
int n;
int arr[MAXSIZE];
int c[MAXSIZE];
int o[MAXSIZE];int change(int arr[], int i, int j)//交换数据3
{int temp = arr[i];arr[i] = arr[j];arr[j] = temp;return 0;
}int print(int arr[], int n)//输出数组
{for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;return 0;
}int permutation(int arr[],int n)//排列
{for (int i = 0; i < n; i++)//初始化c,o两个数组{c[i] = 0;o[i] = 1;}int j = n - 1, s = 0;print(arr, n);while (true) {int q = c[j] + o[j];if (q >= 0 && q != j + 1) {change(arr, j - c[j] + s, j - q + s);print(arr, n);c[j] = q;j = n - 1;s = 0;continue;}if (q == j + 1) {if (j == 0)break;elses++;}o[j] = -o[j];j--;}return 0;
}int main()
{cout << "请输入n的值:";cin >> n;for (int i = 0; i < n; i++){arr[i] = i + 1;}permutation(arr, n);return 0;
}
运行结果如下:
生成排列 --- 蛮力法,Johnson-Trotter算法相关推荐
- 算法设计与分析——Johnson Trotter算法
目录 前言 一.算法思想分析 二.算法效率分析 三.算法代码 C语言代码 后记 前言 排列与组合问题,无论是在我们生活中还是项目实际运用中,都说非常之常见的.那么,如何去运用算法思想生成全排列(一组元 ...
- 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找
目录 蛮力法(brute force): [例4-1]链环数字对 问题分析 计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测: 问题分析 ...
- johnson_trotter(生成排列算法)
思路和步骤: 将数字赋予方向属性 理解什么叫可移动方向(后面在图片1中说明) 判断是否存在可移动元素 bool judge_move(init* n_n, int n); 定义一个全局int k--& ...
- 算法设计与分析------蛮力法
算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...
- 算法设计与分析:蛮力法
算法分析与设计实验报告 第 四 次实验 姓名 裴朵朵 学号 5001170016 班级 计科一班 时间 2019.10.31 地点 实验名称 暴力法的使用 实验目的 1.理解暴力法的工作原理.过程技巧 ...
- C语言编写Johnson-Trotter算法生成排列
//Johnson-Trotter算法生成排列#include<stdio.h>int list[99];在这里插入代码片 int num[99]; int dir[99];int cha ...
- JOHNSON TROTTER 的全排列算法
/*试一试Johnson Trotter的算法*/ /* 数组初始为123 标记数组b[]的初始值是011(0 不可移动,1否) /要不利用二维数组--?/ b[]中找值为一的 然后看 ...
- 用Johnson-Trotter算法生成排列!
package decreaseAndConquer; /* * 实现用来生成排列的Johnson-Trotter算法 * 输入:一个正整数n * 输出:{1,...,n}的所有排列的列表 */ im ...
- 算法小结 之 蛮力法
文章目录 1.1 蛮力法的定义 1.2 蛮力法的优缺点 1.3 蛮力法的设计思想 1.4 蛮力法的经典使用 1.4.1 排序 1.4.1.1选择排序 1.4.1.2冒泡排序 1.4.1.3 顺序查找 ...
最新文章
- 接口有个电池标志_USB接口上的小标签有啥用?从“+”号到闪电的奥秘
- MySQL 5.7---安装详细教程(.zip安装)
- 启明云端分享|SSD202D核心板使用NFS
- HTTP 错误 404 - 文件或目录未找到 - 最终解决方法
- 使用Grab的实验平台进行混沌实验编排
- java 设置不可点击_Java Selenium webdriverwait 解决元素不可点击问题
- 2008年十大IT图书评选第一周幸运读者获奖名单(每周更新)
- java序列化(六) - protostuff序列化
- html5pc转微信小程序,微信电脑版终于支持小程序 新版PC版微信实测
- FBI为车主支招:如何预防汽车黑客
- 因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效......,请慎用
- go任务调度2(linux的cron调用)
- 高性能 TCP UDP 通信框架 HP-Socket v3.3.1
- 极米旗舰级新品极米H5强势来袭:画质性能在线,硬核配置拉满
- 建行手机银行4.0版本转账怎么不要求输入支付密码?
- 华为笔记本键盘说明图_笔记本电脑的的键盘都表示什么意思
- 分组和聚合函数的组合使用实操
- 华为/阿里等公司招聘缩减!科技行业出现衰退?
- 自己当笔记写着玩吧--leetcode- 001
- 服务器的管理IIS 6.0