全排列实现方法(代码)小白按照我说的立马明白

一、全排列的概念

ps:结合代码和代码结果来看,更容易理解
排列:
  从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。
全排列:
  从n个元素取出n个元素的一个排列,称为一个全排列。
比如对123进行全排列
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
时间复杂度:
  n个数的全排列有n!种,每一个排列都有n个数据,所以输出的时间复杂度为O(n*n!),呈指数级,无法处理大型数据。

二、递归的全排列算法

算法思路:
假设我们要对1,2,3,4四个数进行全排列,过程如下:
  (a)首先保持1不变,对2,3,4全排列;
  (b)保持2不变,对3,4全排列;
  ©保持3不变,对4全排列,4的排列只有一种。得到1,2,3,4
  (d)继续保持2不变,3,4互换得到1,2,4,3
  (e)以1,2打头的排列完成,接下来把3换到2的位置,继续©、(d)的操作
  ……
 得到1,3,2,4
   1,3,4,2
   1,4,3,2
   1,4,2,3
  因此得到以1打头的全部排序,以此类推,得到以2,3,4打头的排序,得到全排序。
  个人建议结合代码运行结果查看

package company.zhaoyin;

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
	 public void swap(int a, int b, List<Integer> list) {  
	        int temp = list.get(b);  
	        list.set(b, list.get(a));  
	        list.set(a, temp);  
	    }  
	      
	    public void perm(List<Integer> list,int start, int n) {  
	        if(start==n) {  
	            for(int i=0;i<n;i++) {  
	                System.out.print(list.get(i)+" ");  
	            }   
	            System.out.print("\n");  
	        } else {  
	            for(int j=start;j<n;j++) {  
	            	System.out.println("start:"+start+"\tj:"+j+"\tstart与j进行交换");
	                swap(start,j,list);
	                System.out.println(list.toString());
	                perm(list,start+1,n);  //把要打头的数放到最开头的位置(即start+1所在的位置)
	                swap(start,j,list);  //为避免重复排序,每个数打头结束后都恢复初始排序
	            }  
	        }  
	    }  
	      
	    public static void main(String []args) {  
	    	TestDemo permMe = new TestDemo();  
	        List<Integer> myList = new ArrayList<Integer> ();  
	        for(int i=0;i<4;i++) {  
	            myList.add(i+1);  
	        }  
	        permMe.perm(myList, 0, myList.size());  
	    }  
}

运行结果:

start:0	j:0	start与j进行交换
[1, 2, 3, 4]
start:1	j:1	start与j进行交换
[1, 2, 3, 4]
start:2	j:2	start与j进行交换
[1, 2, 3, 4]
start:3	j:3	start与j进行交换
[1, 2, 3, 4]
1 2 3 4 
start:2	j:3	start与j进行交换
[1, 2, 4, 3]
start:3	j:3	start与j进行交换
[1, 2, 4, 3]
1 2 4 3 
start:1	j:2	start与j进行交换
[1, 3, 2, 4]
start:2	j:2	start与j进行交换
[1, 3, 2, 4]
start:3	j:3	start与j进行交换
[1, 3, 2, 4]
1 3 2 4 
start:2	j:3	start与j进行交换
[1, 3, 4, 2]
start:3	j:3	start与j进行交换
[1, 3, 4, 2]
1 3 4 2 
start:1	j:3	start与j进行交换
[1, 4, 3, 2]
start:2	j:2	start与j进行交换
[1, 4, 3, 2]
start:3	j:3	start与j进行交换
[1, 4, 3, 2]
1 4 3 2 
start:2	j:3	start与j进行交换
[1, 4, 2, 3]
start:3	j:3	start与j进行交换
[1, 4, 2, 3]
1 4 2 3 
start:0	j:1	start与j进行交换
[2, 1, 3, 4]
start:1	j:1	start与j进行交换
[2, 1, 3, 4]
start:2	j:2	start与j进行交换
[2, 1, 3, 4]
start:3	j:3	start与j进行交换
[2, 1, 3, 4]
2 1 3 4 
start:2	j:3	start与j进行交换
[2, 1, 4, 3]
start:3	j:3	start与j进行交换
[2, 1, 4, 3]
2 1 4 3 
start:1	j:2	start与j进行交换
[2, 3, 1, 4]
start:2	j:2	start与j进行交换
[2, 3, 1, 4]
start:3	j:3	start与j进行交换
[2, 3, 1, 4]
2 3 1 4 
start:2	j:3	start与j进行交换
[2, 3, 4, 1]
start:3	j:3	start与j进行交换
[2, 3, 4, 1]
2 3 4 1 
start:1	j:3	start与j进行交换
[2, 4, 3, 1]
start:2	j:2	start与j进行交换
[2, 4, 3, 1]
start:3	j:3	start与j进行交换
[2, 4, 3, 1]
2 4 3 1 
start:2	j:3	start与j进行交换
[2, 4, 1, 3]
start:3	j:3	start与j进行交换
[2, 4, 1, 3]
2 4 1 3 
start:0	j:2	start与j进行交换
[3, 2, 1, 4]
start:1	j:1	start与j进行交换
[3, 2, 1, 4]
start:2	j:2	start与j进行交换
[3, 2, 1, 4]
start:3	j:3	start与j进行交换
[3, 2, 1, 4]
3 2 1 4 
start:2	j:3	start与j进行交换
[3, 2, 4, 1]
start:3	j:3	start与j进行交换
[3, 2, 4, 1]
3 2 4 1 
start:1	j:2	start与j进行交换
[3, 1, 2, 4]
start:2	j:2	start与j进行交换
[3, 1, 2, 4]
start:3	j:3	start与j进行交换
[3, 1, 2, 4]
3 1 2 4 
start:2	j:3	start与j进行交换
[3, 1, 4, 2]
start:3	j:3	start与j进行交换
[3, 1, 4, 2]
3 1 4 2 
start:1	j:3	start与j进行交换
[3, 4, 1, 2]
start:2	j:2	start与j进行交换
[3, 4, 1, 2]
start:3	j:3	start与j进行交换
[3, 4, 1, 2]
3 4 1 2 
start:2	j:3	start与j进行交换
[3, 4, 2, 1]
start:3	j:3	start与j进行交换
[3, 4, 2, 1]
3 4 2 1 
start:0	j:3	start与j进行交换
[4, 2, 3, 1]
start:1	j:1	start与j进行交换
[4, 2, 3, 1]
start:2	j:2	start与j进行交换
[4, 2, 3, 1]
start:3	j:3	start与j进行交换
[4, 2, 3, 1]
4 2 3 1 
start:2	j:3	start与j进行交换
[4, 2, 1, 3]
start:3	j:3	start与j进行交换
[4, 2, 1, 3]
4 2 1 3 
start:1	j:2	start与j进行交换
[4, 3, 2, 1]
start:2	j:2	start与j进行交换
[4, 3, 2, 1]
start:3	j:3	start与j进行交换
[4, 3, 2, 1]
4 3 2 1 
start:2	j:3	start与j进行交换
[4, 3, 1, 2]
start:3	j:3	start与j进行交换
[4, 3, 1, 2]
4 3 1 2 
start:1	j:3	start与j进行交换
[4, 1, 3, 2]
start:2	j:2	start与j进行交换
[4, 1, 3, 2]
start:3	j:3	start与j进行交换
[4, 1, 3, 2]
4 1 3 2 
start:2	j:3	start与j进行交换
[4, 1, 2, 3]
start:3	j:3	start与j进行交换
[4, 1, 2, 3]
4 1 2 3 
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页