生成排列 --- 蛮力法,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改变的方向)。
  1. 初始化:cj=0;oj=1,其中1<=j<=n;
  2. 访问序列a1,a2,a3…an。
  3. 令j=n,s=0.s表示排满足k>j且ck=k-1的ck的个数。
  4. 令q=cj+oj;如果q<j,执行步骤7;如果q=j,执行步骤6.
  5. 交换a[j-cj+s]和a[j-q+s],令cj=q,执行步骤2.
  6. 若j=1,结束算法;否则令s=s+1;
  7. 令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算法相关推荐

  1. 算法设计与分析——Johnson Trotter算法

    目录 前言 一.算法思想分析 二.算法效率分析 三.算法代码 C语言代码 后记 前言 排列与组合问题,无论是在我们生活中还是项目实际运用中,都说非常之常见的.那么,如何去运用算法思想生成全排列(一组元 ...

  2. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

    目录 蛮力法(brute force): [例4-1]链环数字对  问题分析  计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测:​ 问题分析 ...

  3. johnson_trotter(生成排列算法)

    思路和步骤: 将数字赋予方向属性 理解什么叫可移动方向(后面在图片1中说明) 判断是否存在可移动元素 bool judge_move(init* n_n, int n); 定义一个全局int k--& ...

  4. 算法设计与分析------蛮力法

    算法设计与分析------蛮力法(c语言) 一.蛮力法(穷举法 枚举法) 1.定义 2.蛮力法使用情况 3.蛮力法的优点 4.蛮力法的缺点 5.采用蛮力法设计算法的2类: 6.简单选择排序和冒泡排序 ...

  5. 算法设计与分析:蛮力法

    算法分析与设计实验报告 第 四 次实验 姓名 裴朵朵 学号 5001170016 班级 计科一班 时间 2019.10.31 地点 实验名称 暴力法的使用 实验目的 1.理解暴力法的工作原理.过程技巧 ...

  6. C语言编写Johnson-Trotter算法生成排列

    //Johnson-Trotter算法生成排列#include<stdio.h>int list[99];在这里插入代码片 int num[99]; int dir[99];int cha ...

  7. JOHNSON TROTTER 的全排列算法

    /*试一试Johnson Trotter的算法*/ /* 数组初始为123   标记数组b[]的初始值是011(0 不可移动,1否)   /要不利用二维数组--?/   b[]中找值为一的   然后看 ...

  8. 用Johnson-Trotter算法生成排列!

    package decreaseAndConquer; /* * 实现用来生成排列的Johnson-Trotter算法 * 输入:一个正整数n * 输出:{1,...,n}的所有排列的列表 */ im ...

  9. 算法小结 之 蛮力法

    文章目录 1.1 蛮力法的定义 1.2 蛮力法的优缺点 1.3 蛮力法的设计思想 1.4 蛮力法的经典使用 1.4.1 排序 1.4.1.1选择排序 1.4.1.2冒泡排序 1.4.1.3 顺序查找 ...

最新文章

  1. 接口有个电池标志_USB接口上的小标签有啥用?从“+”号到闪电的奥秘
  2. MySQL 5.7---安装详细教程(.zip安装)
  3. 启明云端分享|SSD202D核心板使用NFS
  4. HTTP 错误 404 - 文件或目录未找到 - 最终解决方法
  5. 使用Grab的实验平台进行混沌实验编排
  6. java 设置不可点击_Java Selenium webdriverwait 解决元素不可点击问题
  7. 2008年十大IT图书评选第一周幸运读者获奖名单(每周更新)
  8. java序列化(六) - protostuff序列化
  9. html5pc转微信小程序,微信电脑版终于支持小程序 新版PC版微信实测
  10. FBI为车主支招:如何预防汽车黑客
  11. 因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效......,请慎用
  12. go任务调度2(linux的cron调用)
  13. 高性能 TCP UDP 通信框架 HP-Socket v3.3.1
  14. 极米旗舰级新品极米H5强势来袭:画质性能在线,硬核配置拉满
  15. 建行手机银行4.0版本转账怎么不要求输入支付密码?
  16. 华为笔记本键盘说明图_笔记本电脑的的键盘都表示什么意思
  17. 分组和聚合函数的组合使用实操
  18. 华为/阿里等公司招聘缩减!科技行业出现衰退?
  19. 自己当笔记写着玩吧--leetcode- 001
  20. 服务器的管理IIS 6.0

热门文章

  1. bool 和_Bool , bool _Bool
  2. folly库安装(1)cmake和gcc的安装、升级
  3. 【送书福利-第七期】《分布式中间件核心原理与RocketMQ最佳实践》
  4. 遥感处理平台的发展(ENVI与GEE的比较)
  5. 电子商务顾客评论的热点话题分析(转)
  6. 【基于MAX78000的智能边缘应用设计大赛】
  7. 数据结构中,“结点”的意思
  8. 【学习 · 求职必备】学CV必须关注的会议与期刊
  9. supervisor的用法
  10. 剑指 Offer 14.剪绳子(动态规划、数学分析)