递归算法实现全排列

来源:互联网 发布:ifconfig修改mac地址 编辑:程序博客网 时间:2024/04/30 14:36
import java.util.*;public class Perm{//采用递归算法实现全排列public static void perm(int[] arr,int[] used,LinkedList<Integer>stack){boolean flag = true;for(int i=0;i<arr.length;i++){if(used[i]==0){flag = false;used[i] = 1; //used[]用来标记arr中对应元素是否已经被使用stack.push(arr[i]); //采用栈的数据结构保存找到的排列perm(arr,used,stack);used[i] = 0;//回退的过程中清除标记stack.pop();//相应的从结果栈中清除}}if(flag){//全部元素都已用到for(int e:stack){System.out.print(e+" ");}System.out.println();}}public static void main(String[] args){int[] arr = {1,2,3,4,5};int[] used = new int[arr.length];LinkedList<Integer> stack = new LinkedList<>();perm(arr,used,stack);}}


这种方法比较好理解,但是需要2倍的额外空间,为了解决空间浪费的问题,可以采用下面这种方法

/**(A、B、C、D)的全排列为1、A后面跟(B、C、D)的全排列2、B后面跟(A、C、D)的全排列3、C后面跟(A、B、D)的全排列4、D后面跟(A、B、C)的全排列*/class Perm2 {public static int count =0;public static void perm(int[] arr,int begin){for(int i = begin; i < arr.length; i++){if(begin == arr.length-1){for(int e:arr){System.out.print(e+"");}System.out.println();count++;}else{swap(arr,begin,i);perm(arr,begin+1);swap(arr,begin,i);}}}public static void swap(int[] arr,int i,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] arr = {1,2,3,4,5};perm(arr,0);System.out.println("排列总数 "+count);}}

这种方法不需要额外的空间,两种方法时间复杂度都很高。

0 0
原创粉丝点击