全排列定义
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
简单来说就是把n个不同数的所有排列情况罗列出来
如对1,2,3进行全排列:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
总共有f(n)=n!中排列情况,前提是n个不同的数!
全排列递归实现代码如下
注:下面的代码在原有基础上添加了去重的功能,即当n个数中有相同的数时,也能实现全排列,且没有重复的排列方式
#include <iostream>
using namespace std;
static int count = 0; //定义静态全局变量
int main()
{
int a[] = {1,2,3}; //定义数组
Perm(a, sizeof(a)/sizeof(a[0]), 0); //递归函数
return 0;
}
//N是考虑数组中需要变化的后几位数,即就是前(size-N)位不变,对后N位进行排列
//N为3表示数组不需要变化,直接打印即可,只有一种排列方法
//N为0表示三位数均要排列
void Perm(int* a, int size, int N)
{
if(size==N)
{
for(int i=0; i<size; ++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
count++;
cout<<"count = "<<count<<endl;
}
else
{
for(int i=N; i<size; i++) //使前面不变,后n-i个元素进行排序
{
if(IsSwap(a, N, i)) //判断如果出现重复的就不进行排序
{
swap(a[i], a[N]);
Perm(a, size, N+1);
swap(a[i], a[N]); //每次让相邻的两个元素交换位置
}
}
}
}
bool IsSwap(int *a, int start, int end)//判断该排列方式是否出现过(去重)
{
for (int i = start; i < end; i++)
if (a[i] == a[end])
return false;
return true;
}