5.6.1第一种算法
生成排序的用途在于生成所有的排列问题
下面展示的是书中的伪代码:
PREMUTATIONS1
输入:正整数n
输出:数1,2,····,n的所有可能排序
1.for j <- 1 to n
2. p[j] <- j
3. end for
4. perm1(1)
过程 perm1(m)
1.if m = n then output p[1····n] //输出本次排序结果
2.else
3.for j <- m to n
4. 互换p[j]和p[m]
5. perm1(m+1)
6. 互换p[j]和p[m]
7. comment:这时p[m····n]=m,m+1···,n
8. end for
9.end if
上传代码之前先述说自己遇到的问题:
- 伪代码中的4,6进行交换,我本来是不想用中间变量tmp的,直接可以用a+b=a;b=a-b;a=a-b;直接进行交换,但是j=m就是说,j=m=0时,p[0]=p[0]+p[0];p[0]=p[0]-p[0];那么p[0]会变为0,所以得出a+b的那种交换方法并不适用与两个下标一样的数组进行交换,所以只能用一个中间变量tmp
for (int j=m;j<n;j++){
// p[j]=p[m]+p[j];
// p[m]=p[j]-p[m];
// p[j]=p[j]-p[m]; //互换
下面展示的是Java的实现:
package com.sheye;
/**
* @author Sheye
* @date 2019-10-16 17:55
*/
public class Permutations1 {
private static int p[] = new int[3];
static void perm1(int m){
int n = p.length;
if (m==n-1){
for (int i=0;i<n;i++){
System.out.print(p[i]+",");
}
System.out.println("");
}else{
for (int j=m;j<n;j++){
// p[j]=p[m]+p[j];
// p[m]=p[j]-p[m];
// p[j]=p[j]-p[m]; //互换
int tmp = p[j];
p[j]=p[m];
p[m]=tmp;
perm1(m+1);
// p[j]=p[m]+p[j];
// p[m]=p[j]-p[m];
// p[j]=p[j]-p[m]; //互换
tmp = p[j];
p[j]=p[m];
p[m]=tmp;
}
}
}
public static void main(String[] args) {
for (int j=0;j<p.length;j++){
p[j]=j+1;
}
perm1(0);
}
}
贴上运行结果
每一次循环排序的结果如下:
1,2,3,
1,3,2,
2,1,3,
2,3,1,
3,2,1,
3,1,2,
5.6.2第二种算法
下面展示的是书中的伪代码:
PREMUTATIONS2
输入:正整数n
输出:数1,2,····,n的所有可能排序
1.for j <- 1 to n
2. p[j] <- 0
3. end for
4. perm2(n)
过程 perm1(m)
1.if m = 0 then output p[1····n] //n个数均在排列中固定一遍
2.else
3. for j <- 1 to n
4. if p[j]=0 then //若p[j]为自由项
5. p[j] <- m //将p[j]的值固定为m
6. perm2(m-1) //固定m-1的位置,求n-1个数全排列
7. p[j] <- 0 将p[j]恢复为自由项
8. end if
9. end for
10.end if
下面展示的是Java的实现:
package com.sheye;
/**
* @author Sheye
* @date 2019-10-16 18:53
*/
public class Permutations2 {
private static int p[] = new int[3];
private static int n = p.length;
static void perm2(int m){
if (m==0){
for (int i=0;i<n;i++){
System.out.print(p[i]+",");
}
System.out.println("");
}else {
for (int j=0;j<n;j++){
if (p[j]==0){
p[j]=m;
perm2(m-1);
p[j]=0;
}
}
}
}
public static void main(String[] args) {
for (int j=0;j<n;j++){
p[j]=0;
}
perm2(n);
}
}
贴上运行结果:
每一次循环排序的结果如下:
3,2,1,
3,1,2,
2,3,1,
1,3,2,
2,1,3,
1,2,3,
本人学生党一枚,知识浅薄。写代码时也比较匆忙,因为还有其它的东西需要去学习,把算法实现纯属兴趣,测试时也没有带多组值进行测试,如代码上有问题,请在评论区评论指出,感激不尽。