分析
以1,2,3的全排列为例,可以分为如下过程:
1 + [2,3的全排列]:
1 + 2 + [3的全排列]:1,2,3
1 + 3 + [2的全排列]:1, 3, 2
2 + [1,3的全排列]:
2 + 1 + [3的全排列]:2,1,3
2 + 3 + [1的全排列]:2,3,1
3 + [2,1的全排列]:
3 + 1 + [2的全排列]:3,1,2
3 + 2 + [1的全排列]:3,2,1
以上可以用递归的思想实现,设一个数组arr,从start到end的全排列,需要注意:
1.第一个数字的确定:
用for循环,从start到end的循环,每次将i和start交换,执行递归,但是,每次递归完需要把数据交换回去。
2.结束语句的确定:
当start=end的时候结束,输出。
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int arr[] = { 1, 2 , 3, 4};
fullSort(arr, 0 ,arr.length-1);
System.out.println();
}
public static void fullSort(int[] arr, int start, int end)
{
if(start == end)
{
for(int i : arr)
System.out.print(i + " ");
System.out.println();
return;
}
for(int i = start; i <= end; i++)
{
swap(arr, i , start);
fullSort(arr, start + 1 , end);
swap(arr, start, i);
}
}
public static void swap(int arr[], int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}