引入
以1 2 3 为例,其全部排列如下:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
以1作为头部为例,可以看出1为头部排列的剩余两个位置其实就是 2 3的全排列,因此可以得
出:
对于一个集合来说,他的全部排列为他的每一个元素作为头部时,对剩余元素全排列的总排列
详解
将每一个元素作为头部的排列为一类,因此,对这个题的解释为:
总排列=1为头部的剩余元素进行全排列+以2为头部的剩余元素进行全排列
+以3为头部的剩余元素进行全排列
代码
依据上述例子,可以用递归的思想写出如下代码:
#include<iostream>
using namespace std;
void swap(int&a,int&b)
{
int t=a;
a=b;
b=t;
}
//对指定范围内数据进行全排列,一般start为0,end为数组的最后一个有效位置下表或size-1
void all_permutation(int arr[],int start,int end)
{
//对序列进行遍历,依次让每个元素作为头部
for(int i=start;i<=end;i++)
{
//让当前遍历到的元素作为头部
swap(arr[start],arr[i]);
//让剩余元素进行全排列
all_permutation(arr,start+1,end);
//交换回来,不影响下个元素作为头部
swap(arr[start],arr[i]);
}
//当所有元素都当过头部了,就排列完了,打印就行了
if(start==end)
{
for(int i=0;i<=end;i++)
{
cout<<arr[i]<<endl;
}
}
}
int main(void)
{
int arr[]={1,2,3};
//对0-2下标范围内进行全排列
all_permutation(arr,0,2);
return 0;
}