1.全排列函数(next_permutation) 实现
这个函数就是用来求数组的全排列的,至于怎么用,看下面的介绍:
这是一个c++函数,包含在头文件algorithm里面,这个函数可以从当前的数组的大小按照字典序逐个递增的顺序排列
看下面的模板
int a[];
do
{
}while(next_permutation);
下面代码可以输出1~n的全排列:
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)&&n){
int a[1000];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);//可以自行测试一下删除后的结果
do{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}while(next_permutation(a,a+n)); // 每次循环就获取下一个排列
}
return 0;
}
上面代码有一个sort,但是如果没有的话,只会出现从当前的大小按字典序逐个增加的排序
2.递归实现
具体怎么实现的可以动笔画画,先拿个只有3个元素的数组分析,找到其中的规律才是最重要的
#include <stdio.h>
#include <stdlib.h>
int n=0;
void swap(int *a, int *b)
{
int m;
m=*a;
*a=*b;
*b=m;
}
void perm(int list[], int k, int m)
{
int i;
if(k==m)
{
for(i=0;i<=m;i++)
printf("%d ",list[i]);
printf("\n");
n++;
}
else
{
for(i=k;i<=m;i++)
{
swap(&list[k],&list[i]);
perm(list, k+1, m);
swap(&list[k], &list[i]);
}
}
}
int main(void)
{
int list[]={1,2,3,4,5,6,7};
perm(list,0,6);
printf("total:%d\n",n);
system("pause");
return 0;
}
参考资料:
https://www.cnblogs.com/xianzhedeyu/p/3822946.html
https://www.cnblogs.com/caijiaming/p/9431645.html