手撸代码系列(七)

第七期:实现一个算法求某集合的全排列(递归交换法)

题目分析:以集合a={A,B,C,D,E}为例
ABCDE

第一步: 我们以第一个元素 A 开始进行与后面的元素进行交换,递归下去。即 ABCDE 中的任何一个元素进行交换。

第二步:对于 BCDE , 我们利用递归的思想,利用当前的第一个元素 B 开始进行与后面的元素进行交换。即 BCDE 中的任何一个元素进行交换。

第三步:对于 CDE , 我们利用递归的思想,利用当前的第一个元素 C 开始进行与后面的元素进行交换。即 CDE 中的任何一个元素进行交换。

第四步:对于 DE , 我们利用递归的思想,利用当前的第一个元素 D 开始进行与后面的元素进行交换。即 DE 元素进行交换。
得到其中的一种全排列方式的结果是:

ABCED

第五步:上一次交换后得到的结果,我们需要还原现场,即回溯

Java代码:
/**
 * 全排列问题
 * abc三个元素的全排列。
 * abc acb bac bca cab cba
 */
public class Permutation2 {
    public static void main(String[] args) {
        char[] data = "abc".toCharArray();
        f(data, 0);
    }
    /**
     * 第0个元素与之后的每个元素交换
     * 第1个元素与之后的每个元素交换
     * ....
     * @param data
     * @param k: 当前的交换位置(关注点),与其后的元素交换
     */
    private static void f(char[] data, int k) {
        // 自己带出口,不需要再次写出口。
        if (k==data.length-1){
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i]+" ");
            }
            System.out.println();
        }
        for (int i = k; i < data.length; i++) {
            //试探交换
            {
                char temp = data[k];
                data[k] = data[i];
                data[i] = temp;
            }
            f(data, k + 1);
            //回溯交换
            {
                char temp = data[k];
                data[k] = data[i];
                data[i] = temp;
            }
        }
    }

}

简要分析:

挑战:递归的效率不高,有待改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值