版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27855219/article/details/52733650
递归求全排列算法:
例如:char a[]=”abc” ,(i,j,k)表示数组现有的元素
perm(a,k,m);//从数组下标k到m的全排列
k==m 只剩一个元素为递归出口
C++源码:
#include <iostream>
using namespace std;
/*对数组元素全排列
如 a[]="abc";
结果为:
abc
acb
bac
bca
cba
cab
*/
int swap(char a[],int i,int j){//交换数组下标为i和j的元素
char temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
return 0;
}
int perm(char a[],int k,int m){
if(k==m)
cout<<a<<endl;
else{
for (int i=k;i<=m ;i++) {
swap(a,k,i);//每个子串的第二个字符起、都分别与第一个字符交换、形成新的a、进行全排列
perm(a,k+1,m);//除第一个字符外剩下的全排列递归
swap(a,k,i);//恢复还原a[]
/* code */
}
}
return 0;
}
int main() {
char a[]="abc";
char *p=a;
int length=0;
while(*p!='\0'){
length++;
p++;
}
perm(a,0,length-1);//对数组a[] 从下标0到length-1全排列
return 0;
}