算法设计:全排列算法代码实现

在上星期的算法设计课程的学习中,我们学习了两种全排列算法,该算法用于求出数组{1,2,3,...,n}的所有可能的排列,今天我们就来看看这个算法的具体代码实现。

1. 第一种算法

第一种算法和我们现实生活中习惯的方法较为相似,以{1,2,3}为例,我们先写出第一种排列123,然后将2与3交换,得到132;再回到123,交换1与2得到213,再将1与3交换.....直到得到所有的排列。

该算法伪码如下:

PERMUTATIONS1(int n):

  1. for j←1 to n
  2.   a[j]←j
  3. end for
  4. perm1(1)

perm1(int m):

  1. if m = n then output a[1...n]
  2. else
  3.   for j←m to n
  4.     互换a[j]和a[m]
  5.     perm1(m+1)
  6.     互换a[j]和a[m]
  7.   end for
  8. end if

 

具体代码实现如下:

 1 //第一种排列生成算法
 2 public class Permutations1 {
 3     private int a[] = new int[50];    //声明存放数据的数组
 4     private int length = 0;
 5     //构造函数
 6     public Permutations1(int length)
 7     {
 8         this.length = length;
 9         for(int i=1;i<=length;i++)
10             a[i] = i;
11     }
12
13     //执行全排列算法
14     public void perm1(int n)
15     {
16         if(n == length)
17             this.dispArray();    //到最底层时输出排列结果
18         else
19         {
20             for(int i=n;i<=length;i++)
21             {
22                 this.swap(i, n);  //交换两数的值
23                 perm1(n + 1);    //递归执行perm1
24                 this.swap(i, n);    //恢复位置
25             }
26         }
27     }
28
29     //交换数组中两数的值
30     public void swap(int x, int y)
31     {
32         int t = a[x];
33         a[x] = a[y];
34         a[y] = t;
35     }
36
37     //输出排列
38     public void dispArray()
39     {
40         for(int i=1;i<=length;i++)
41             System.out.print(a[i]);
42         System.out.println();
43     }
44 }

2. 第二种算法

第二种算法比较类似于我们中学学的排列组合,还是以{1,2,3}为例,我们先确定第一个位置的数字3,再确定第二个位置的数字2,再确定最后一个位置的数字1,然后我们再向前恢复,再次确定第二个位置的数字....直到得到所有的排列。

该算法伪码如下:

PERMUTATIONS2(int n):

  1. for j←1 to n
  2.   a[j]←0
  3. end for
  4. perm2(n)

perm2(int m):

  1. if m=0 then output a[1...n]
  2. else
  3.   for j←1 to n
  4.     if a[j]=0 then
  5.       a[j]←m
  6.       perm2(m-1)
  7.       a[j]←0
  8.     end if
  9.   end for
  10. end if

具体代码如下:

 1 //第二种排列生成算法
 2 public class Permutations2 {
 3     private int a[] = new int[50];    //声明存放数据的数组
 4     private int length = 0;    //声明数组长度
 5
 6     //构造函数
 7     public Permutations2(int length)
 8     {
 9         this.length = length;
10         for(int i = 1;i<=length;i++)
11             a[i] = 0;    //将所有元素记为零
12     }
13
14     public void perm2(int n)
15     {
16         if(n == 0)
17             this.dispArray();
18         else
19         {
20             for(int i=1;i<=length;i++)
21             {
22                 if(a[i] == 0)    //如果该位为空
23                     {
24                         a[i] = n;    //将n的值赋给该位
25                         perm2(n - 1);    //递归执行
26                         a[i] = 0;    //恢复
27                     }
28             }
29         }
30     }
31
32     //输出排列
33     public void dispArray()
34     {
35         for(int i=1;i<=length;i++)
36             System.out.print(a[i]);
37         System.out.println();
38     }
39 }

原文地址:https://www.cnblogs.com/sunriseblogs/p/9873013.html

时间: 2024-10-01 04:40:31

算法设计:全排列算法代码实现的相关文章

【字符串处理算法】将输入字符串中的各个单词反序的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序将该字符串中的各个单词反序拼装并输出.例如,如果输入的字符串是"Hello, how do you do",那么输出的字符串为"do you do how Hello,".注意保留各个单词之间的空格及相应的标点符号. 二.算法设计 通过观察示例字符串(即"Hello, how do you do"),我们可以看到该字符串中各个单词与空格之间的关系为:单词总数=空格总数+1.也就是说,示例字符串中的空格总数为4

【字符串处理算法】回文判断的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序判断这个字符串是否是回文串. 为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种.其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符. 所谓回文串,是指正读和反读都一样的字符串.下面举几个例子予以说明: 1."level"是一个非中文字符的回文串,因为正读和反读都是"level". 2."Good"不是一个非中文字符的回文串. 3."我爱我"是一个中文字符的回文串,

【字符串处理算法】字符串包含的算法设计及C代码实现【转】

转自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587 版权声明:本文为博主原创文章,对文章内容有任何意见或建议,欢迎与作者单独交流,作者QQ(微信):245924426. 一.需求描述 输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出. 例如,如果输入的字符串是“12345”,那么输出的整数是12345.注意,不要使用C语言的库函数atoi. 二.算法设计 我们都知道,如果给定一个整数123,那么其表示

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st

【字符串处理算法】最长连续字符及其出现次数的算法设计及C代码实现

一.需求描述 输入一个字符串,编写程序找出这个字符串中的最长连续字符,并求出其连续出现的次数. 例如,"123444445"中的最长连续字符是4,其连续出现的次数为5:"abcddef"中的最长连续字符是d,其连续出现的次数为2:"ab"中的最长连续字符是a,其连续出现的次数为1. 二.算法设计 我们可以采取逐个比较字符串中各个字符的办法来获取最长连续字符及其连续出现的次数.程序的总体流程如图1所示. 图1 程序的总体流程 三.特殊流程考虑 在编

【字符串处理算法】删除特定的字符的算法设计及C代码实现

一.需求描述 输入一个长字符串和一个短字符串,编写程序从长字符串中将在短字符串出现过的字符删除掉. 例如,长字符串为"1234abcd",短字符串为"3a",那么经程序处理之后的字符串为"124bcd":又如,长字符串为"good bye",短字符串为"obh",那么经程序处理之后的字符串为"gd ye". 二.算法设计 我们可以通过将长字符串中的字符逐个与短字符串中的字符相比较来判断是

将前缀和后缀相同的文件移动到同一个目录的算法设计及C代码实现

一.需求描述 在Linux系统的某几个目录下有一些前缀和后缀相同的文件,编写程序将它们移动到同一个目录下. 例如,有三个源目录FileDir1.FileDir2和FileDir3,里面分别存放有文件File_1.txt.File_2.txt和File_3.txt.由于它们有相同的前缀(File_)和后缀(txt),所以要将这三个文件移动到同一个结果目录(假设为GatherDir)中. 二.算法设计 基于需求,可以采用如图1所示的程序流程: 图1 程序总体流程 三.特殊流程考虑 在编写程序的过程中

【字符串处理算法】字符串包括的算法设计及C代码实现

一.需求描写叙述 给定一个长字符串和一个短字符串.编敲代码推断短字符串中的全部字符是否都在长字符串中.假设是,则长字符串包括短字符串:反之,不包括. 为了尽量包括大多数情况,字符串中能够包括大写和小写英文字母.数字和各种标点符号.而且区分大写和小写字母. 以下举几个样例予以说明: 1.假设长字符串是"ABCDE",短字符串是"ADC",那么短字符串中的全部字符都在长字符串中.即长字符串包括了短字符串. 2.假设长字符串是"ABCDE",短字符串是

算法设计-全排列递归

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如果只有一个

算法(全排列算法封装)

本算法是教材中的全排列方法之一,本人仅做封装,在此感谢发现算法和传播算法的大牛们. /// <summary> /// 全排列算法,算法原理:Perm(n)=[n]*Pern(n-1).N的全排列等于将N个数取一个放在第N个位置后,剩下的N-1个数做全排列. /// 这个算法的一个用途是进行行列式的展开和计算,这也是这次封装这个算法的目的. /// </summary> public class Permulation { /// <summary> /// 排列结果