最近做笔试题,经常碰到设计到全排列或者全排列为基础的一些东西,就学习了一下如何进行全排列。
我在这里把全排列的数据放入了一个二维数组中。因为全排列是很多东西的基础,保存在二维数组方便调用。
全排列递归根据各位博主大佬的博客学习,实际上就是树结构,理解简单,但是推演递归就稍微麻烦一些。这里做一个我自己手写的推演,方便理解。
下面就是代码(干货):
#include <iostream>
using namespace std;
void sawp(char *p ,int i,int j)//swap是系统的,我就随便换个名字,
{
char temp=NULL;
char temp2=NULL;
if (i!=j)
{
temp=p[i];
temp2=p[j];
p[i]=p[j];
p[j]=temp;
}
}
void *list(char *p,int length,int index,char **k)
{
int o=0;
if (index>=length)
{
for (int i=0;i<length;i++)
{
cout<<p[i];
}
k[o]=p;
o++;
cout<<endl;
}
else
{
for (int i=index;i<length;++i)
{
sawp(p,i,index);
list(p,length,index+1,k);
sawp(p,i,index);
}
}
return *list;
}
template<class T>
int length(T& arr)
{
//cout << sizeof(arr[0]) << endl;
//cout << sizeof(arr) << endl;
return sizeof(arr) / sizeof(arr[0]);
}
int cheng (int var)
{
int a=1;
for (int i=1;i<=var;i++)
{
a*=i;
}
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
char p[]={'1','2','3','4'};
int len=length(p);
//二维数组保存所有结果
int count=cheng(len);
char **a=new char* [count];
for (int i=0;i<len;i++)
{
a[i]=new char[len];
}
list(p,len,0,a);
return 0;
}
第一次写博格,大家留言,我多多改进!