Java用递归实现全排列,详细

package edu.cqu.algorithmTest;

import java.util.Scanner;

// 全排列,递归实现
public class Main8 {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3};
        bfs(arr, 0, arr.length - 1);
    }

    public static void bfs(int []a,int start,int end) {
    	/*
    	 * 递归的终点是,我们拿着start去逐个和后面的集合考虑要不要交换:
    	 * 当需要交换时,我们交换,start+1
    	 * 当不需要交换时,我们不交换,start还是要加1,因为我们要靠着start进入递归的最底层
    	 * 一直start比较到最后了,交不交换都反正都结束了,我们打印处结果。然后返回到递归的上一层。
    	 * 在上一层(我们的start后退一步),搜索是否应该和start交换的i也加1了。
    	 * 如处理{1,2,3}全排列
    	 * 相当于在处理完{2,3}的全排列后,
    	 * 我们回到上一层,start到了{1},此时需要考虑将{1} 和{2,3}里面交换。i就是去寻找2,3的
    	 *
    	 *
    	 * */
    	if(start == a.length) {
    		for(int i:a) {
    			System.out.print(i);
    		}
    		System.out.println();

    	}

    	for(int i = start;i < a.length;i++) {
    		if(isUnique(a,start,i)) {
    			swap(a,start,i);
        		bfs(a,start+1,i);
        		/*
        		 * 为什么要再交换呢?
        		 * 你比如还是{1,2,3},我拿着{1}去交换{2,3}中间的{2},交换完成之后,
        		 * 显然成了{2} {1,3} 即2,1,3和2,3,1
        		 * 但是,我还要拿{1}去换{2,3}中的3啊,数组成了[2,1,3][2,3,1]我再拿第一个位置交换第三个位置显然乱套
        		 * 所以,我们恢复原样。当递归完成,回到上一层的时候,上一层的start,i还在哪给你记着呢,你本来换了哪个数
        		 * 原原本本给换回来。每一层都一样,所以不会乱。
        		 *
        		 *
        		 * */
        		swap(a,start,i);
        	}

    	}
    }

    static boolean isUnique(int a[],int start,int end ) {
    	/*
    	 * //如果在需要被交换的数a[end]之前出现了和它一样的数,例如{1}想要交换到{2,3,4}中的4没有问题,
    	 * 换完之后组成新的集合{2,3,1}进行递归,递归会处理好{2,3,1}的全排列
    	 * 但是如果{1}想要和{4,3,4}中的后面一个4进行交换就需要排除,因为当{1}和第一个4交换,已经将{1,3,4}的全排列
    	 * 结果全部给出了。
    	 * 因此,我们逐个检查a[end]这个元素之前,有没有和它 一样的数
    	 *
    	 *
    	 * */
    	for(int i = start ;i < end; i++) {
    		if(a[i] == a[end]) {
    			return false;
    		}
    	}
    	return true;
    }

    public static void swap(int []a,int m,int n) {
    	int t = a[m];
    	a[m] = a[n];
    	a[n] = t;
    }

}

  

原文地址:https://www.cnblogs.com/theWinter/p/10464589.html

时间: 2024-10-10 03:29:04

Java用递归实现全排列,详细的相关文章

Java使用递归实现全排列的代码

将写内容过程经常用到的一些内容备份一下,下边内容是关于Java使用递归实现全排列的内容. public class AllPermutation { public static void main(String[] args) { char[] source=new char[]{'A','B','C'}; char[] result=new char[source.length]; allPermutation(0,source,result); } public static void al

Java 实现m个数全排列组合以及从M中选取N个数(有序)

(1)全排列组合的递归规律: 集合s的全排列组合 all(s)=n+all(s-n);其中n为已经取出的集合 以集合 s={1,2,3}为例,则s的全排列组合为all(s)={1}+all({2,3});其中n={1},s-n={2,3} 通过以上例子,我们可以知道上述算法可以用递归来解决. 我们取极端情况,如果集合s为空,那么说明不需要再进行递归. 全排列组合,如果集合有4个元素,则全排列组合的个数为 A(4,4)=4*3*2*1=24种,代码如下: package dataStructer;

Java实现字符数组全排列

import org.junit.Test; public class AllSort { public void permutation(char[] buf, int start, int end) { if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可 for (int i = 0; i <= end; i++) { System.out.print(buf[i]); } System.out.println(); } else {//

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数

Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayLis

Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 第1部分 Stack介绍 Stack简介 Stack是栈.它的特性是:先进后出(FILO, F

Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

适配器模式,将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 代码实现: //Adapter.h #include "stdafx.h" #include <iostream> class Adaptee

黑马程序员——Java基础---递归

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                                                       递归 Java支持递归. 递归是根据自身定义内容的过程.就java编程而言,递归是一个允许方法调用自身的特征. 调

Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

此页面为WP8"Surface Pro 3"应用的发布页面. "Surface Pro 3"是一款收集Surface Pro 3的玩机技巧的WP8程序,更好的帮助Surface用户理解并使用它. 此页面主要记录开发进度.APP发布等情况. -------------------相关进度--------------------- 目前进度:UI相关资源前期准备中,各相关开放平台的AppID申请中... Java 集合系列 09 HashMap详细介绍(源码解析)和使用