要点:相比于普通的递归全排列,按字典排序的全排列需要用到排序函数(下面代码中的Sort函数),要为字符先排好序(按ASCLL值),再进行递归排列。
普通的递归全排列(可与本文的代码比较来看):https://blog.csdn.net/qq_40760732/article/details/100098306
注意:Perm(char list[],int p,int q)做的是数组list[]中下标值p与q之间所有元素的全排列,再Perm函数中调用Sort(list,p,q+1)做的是下标值为p到q+1之间元素的全排列,每次递归p值都会加一,即每次都会对除下标值为零之外的元素进行排序。
#include<iostream>
using namespace std;
void Sort(char a[], int g, int b); //声明排序函数,对下标值为g到b之间的元素进行排序
void Swap(char& a, char& b)
{
char tem;
tem = a;
a = b;
b = tem;
}
void Perm(char list[], int p, int q)
{
if (p == q)
{
for (int i = 0; i <= q; i++)
cout << list[i];
cout << ' ';
}
else
{
for (int i = p; i <= q; i++)
{
Sort(list,p, q + 1); //每次递归都要排序
Swap(list[i], list[p]);
Perm(list, p + 1, q);
Swap(list[i], list[p]);
}
}
}
//排序函数(选择排序法)
void Sort(char a[],int g,int b)
{
char tem;
int m,n;
for (int i = g; i < b; i++)
{
m = i;
for (int j = i + 1; j < b; j++)
{
if (a[m] > a[j])
{
m = j;
}
}
if (m != i)
{
tem = a[m];
a[m] = a[i];
a[i] = tem;
}
}
}
int main()
{
int i;
char* a = new char[20];
cin.getline(a, 20,'\n');
for (i = 0; a[i] != ','; i++)
i = i;
Sort(a,0, i);
Perm(a, 0, i-1);
return 0;
}