写这个题的原因是面试百度的时候, 被问到了,当时没给出一个好的解答来
所以在这写出来,给自己提醒提醒
首先,解题的思路全部来自这个链接
全排列之JAVA实现
全排列的基本思想是:
把待全排列记录分为两个部分:
(1) 第一个记录
(2) 剩下的所有元素
所有记录的全排列就是所有可能出现在第一个位置的记录与剩下所有元素的全排列。
以[1,2,3]为例,
1,2,3的全排列可以看作是
1,[2,3的全排列]
[2,3]的全排列又可以看作是
2,[3的全排列]—————对应123
3,[2的全排列]—————对应132
2,[1,3的全排列]
[1,3]的全排列又可以看作是
1,[3的全排列]—————对应213
3,[1的全排列]—————对应231
3,[1,2的全排列]
[1,2]的全排列又可以看作是
1,[2的全排列]—————对应312
2,[1的全排列]—————对应321
这个的思路就完全的抄袭那个作者了,
至于具体的实现部分,我就自己来写了吧
1.本质是递归;
相当于, 我先选了第一个数,然后对后面两个数再进行全排列的过程;
2.用完以后, 我需要把原数组的位置调换过来
3.结束的标志是什么?
是开始的那个下标的数字等于数组末尾的那个下标数字
说明一次结束
主函数:
fullSort(int[] arr,int start,int end){
//出口
if(start==end){
for(int i :arr){
sout(i)
}
sout()//空格
return;
}
for(int i=start;i<=end;i++){
swap(arr,start,i);
fullsort(arr,start+1,end);
swap(arr,start, i);
}
public static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}