全排列算法-递归
#include<algorithm>后,可以使用其中的next_permutation()函数
#include <iostream>
#include <cstring>
#include <cstdio>
#include <windows.h>
#include <algorithm>
using namespace std;
int main()
{
int a[3];
int len=sizeof(a)/4;
for(int i=0;i<len;i++)
{
a[i]=i+1;
}
do{//这里用do while,先输出未用排列函数打乱之前的排列,不然会少一个
for(int i=0;i<len;i++)
printf("%d",a[i]);
printf("\n");
}while(next_permutation(a,a+len));
system("pause");
return 0;
}
next_permutation()函数会重修排列数组,并返回true false
达到最后一个排列时,返回false
void permutation(int a[],int start,int total)
{
if (start == total - 1)
{
//排列好了,进行操作
for (int i = 0; i<total; i++)
cout << a[i]<<" ";
cout << endl;
return;
}
int temp = 0;
for (int i = start; i < total; i++)
{
//swap(*(a + start), *(a + i));
swap(a[start], a[i]);//交换
permutation(a, start + 1, total);
swap(a[i], a[start]);//本次排列结束,恢复状态,等待下一个循环的交换
}
}
或者用全局数组,传参数少
#include <iostream>
#include <cstring>
#include <cstdio>
#include <windows.h>
#include <algorithm>
using namespace std;
#define n 5// 更大的数,控制台可能就没法显示全了,只显示后面的一部分
void permut(int index);
int a[n]={0};
int p[n]={0};
bool harsh[n]={false};
int len=sizeof(a)/4;
int cnt=0;
int main()
{
//int len=sizeof(a)/4;
for(int i=0;i<n;i++)
a[i]=i+1;
permut(0);
cout<<cnt;
system("pause");
return 0;
}
void permut(int index)
{
if(index==len)
{
for(int i=0;i<len;i++)
printf("%d",p[i]);
printf("\n");
cnt++;
return;
}
for(int i=0;i<len;i++)
{
if(harsh[i]==false)
{
p[index]=a[i];
harsh[i]=true;
permut(index+1);
harsh[i]=false;
}else
continue;
}
return;
}