5.6生成排序

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

上传代码之前先述说自己遇到的问题:

  1. 伪代码中的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,

本人学生党一枚,知识浅薄。写代码时也比较匆忙,因为还有其它的东西需要去学习,把算法实现纯属兴趣,测试时也没有带多组值进行测试,如代码上有问题,请在评论区评论指出,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值