问题:对一个数组,从第n个数开始对其后面的数进行全排列;
思路:我们以1,2,3,4,5,这组数为例,令n=2,也就是对3,4,5进行全排列,而对于这三个数进行全排列,我们可以利用swap这个方法,首先考虑用第一个数3与后面的两个数分别进行交换,得到4,3,5和5,4,3;然后可以对1,2,3的后两位进行交换,得到1,3,2;对于4,3,5和5,4,3也同样交换后两位数,这样就得到了4,5,3,和5,3,4这两组数,到此我们对这三个数完成了全排列。总结一下,这里我们是从第一个数起,每个数与它后面的数分别进行交换,由此来完成全排列。
所以可以得出如下的代码:
void Perm(int* arr,int size,int n)
{
if(n<size)
{
for(int i=n;i<size;++i)
{
swap(arr[n],arr[i]);
Perm(arr,size,n+1);
swap(arr[n],arr[i]);
}
}
else
{
for(int i=0;i<size;++i)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
}
但是这里有一个严重的问题,那就是对于一组数当中如果存在重复的元素的话,那就会出现重复情况了。
例如:对1,2,3,4,3这组数,令n=2,执行上述算法: