算法设计与分析-----全排列的递归算法

QUESTION:设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列

 递归的思想:
              R={r1,r2,…,rn}是要进行排列的n个元素
              Ri=R-{ri}
              集合X中元素的全排列记为perm(X)。
              (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列

 归纳整理之后:
               当n=1时:
	           perm(R)=(r),r是集合R中唯一的元素;
               当n>1时:
	           perm(R)={(r1)perm(R1),				
               (r2)perm(R2),
	           ..........,
               (rn)perm(Rn)} 
               
    实现思想:将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列

核心的算法:
public static void perm(Object [] list ,int k,int m)
      	  {	//若所有要排列元素都为前缀,则依次输出
            	if(k==m){
	           	   for (int i=0;i<=m;i++)
			           System.out.print(list[i]+" ");
		               System.out.println();
	           }//否则,前缀增1,后缀减1
	            else{//依次将原后缀中任一个元素放入到前缀中,得到新的前后缀,进行递归
		             for(int i=k;i<=m;i++){
		             	e4.swap(list,k,i);
			            perm(list,k+1,m);
			          e4.swap(list, k, i);			
		         }
          	}
    	}
    	
public static void swap(Object [] list,int k,int m )
{	
  //作用:输出数组list中,前缀为顺序的前k个元素,后缀为后m-k个元素的全排列,所组成的排列
  //参数:list数组,要进行排列的元素
  //k,数组下标0-(k-1)为前缀
  // m,数组下标0-m为要进行排列的元素
  //说明:若要对list中的所有元素进行排列,k应为0,m应为数组上
	Object t;
	t=list[k];
	list[k]=list[m];
	list[m]=t;
}

算法设计与分析-----全排列的递归算法_第1张图片

完整的代码:

public class Solution {
	/*
	 * 对数组arr进行全排列 全排列的范围:begin~end
	 */
	public void perm(int[] arr, int begin, int end) {
		// 设置递归的出口,即当需要全排列的范围只有一个元素,则全排结束,此数组为全排列
		if (begin == end) {
			for (int i = 0; i <= end; i++) {
				System.out.print(arr[i] + " ");
			}
			System.out.println();
			return;
		} else {
			// for循环将begin~end中的每一个数放到begin位置中去,并实现全排列
			for (int j = begin; j <= end; j++) {
				swap(arr, begin, j); // for循环将begin~end中的每一个数放到begin位置中去
				perm(arr, begin + 1, end); // 假设begin位置确定,那么对begin+1~end中的数组进行全排列
				swap(arr, begin, j); // 换过去后再将数组还原
			}
		}
	}

	public void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	public static void main(String[] args) {
		int[] arr = new int[] { 1, 2, 3 };
		Solution solution = new Solution();
		solution.perm(arr, 0, 2);
	}
}

结果图

算法设计与分析-----全排列的递归算法_第2张图片

你可能感兴趣的:(算法)