毕业一年多了,想复习一下旧知识,温故而知新,想起了全排列,就复习一遍;

全排列定义为:若有m个数或字母,选择其中的n个(n<=m)进行排列,并且排列不重复 

思路:如1、2、3、4、5,每个数字都有机会在每个位置中出现,那就按顺序来排,先模仿一次

如第一次进入函数是时,将datas的第一个值付给nTarget然后压栈,从nData中删去对应的值,此时nDatas值为1,nTarget的值为2、3、4、5,然后压栈,然后进行第一次递归,按照上面的步骤,此时nData的值为1、2;nTarget为3、4、5.。。。其实大家可以调试下面的代码就能看出是如何进行的,我就不多说了

for (int i = 0; i < datas.size(); i++) {

			List<Object> nDatas = new ArrayList<Object>(datas);
			List<Object> nTarget = new ArrayList<Object>(target);
			nTarget.add(nDatas.get(i));
			nDatas.remove(i);
			sortByNum(nDatas, nTarget, Num);
		}




import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class Pailie {


	private static void sortByNum(List datas, List target, Integer Num) {
		if (target.size() == Num) {
			for (Object obj : target)
				System.out.print(obj);
			System.out.println();
			return;
		}
		for (int i = 0; i < datas.size(); i++) {


			List<Object> newDatas = new ArrayList<Object>(datas);
			List<Object> newTarget = new ArrayList<Object>(target);
			newTarget.add(newDatas.get(i));
			newDatas.remove(i);
			sortByNum(newDatas, newTarget, Num);
		}
	}


	public static void main(String[] args) {
		String[] datas = new String[] { "1", "2", "3", "4", "5" };
		while (true) {


			Scanner scanner = new Scanner(System.in);


			System.out.println("请重新输入需要排列的数组长度:");
			String inputNum = scanner.nextLine();


			Integer Num = Integer.parseInt(inputNum);
			if (datas.length >= Num) {
				sortByNum(Arrays.asList(datas), new ArrayList<Object>(), Num);
				
			} else {
				System.out.println("结束");


			}
		}
	}
}