来源于离散数学基础P79
//给定排列不是最大排列:n,n-1,.....1,寻找下一个更大排列的过程
void nextpermutation(int a[1....n])
//a1,a2,...an存储在数组a中
{
j=n-1;
while(a[j]>a[j+1])j--;
//使得j是a[j]<a[j+1]的最大下标
k=n;
while(a[j]>a[k])k--;
swap(a[j],a[k]);//互换aj,ak
r=n;
s=j+1;
while(r>s)
{
swap(a[r],a[s]);
r--;
s++;
}
}
//调用函数
void permutation (int a[1....n])
{
sort(a);//非递减排序
long a=n!-1;//第一次直接写出来即可
while(a-->0)
{
nextpermutation(a);
print(a)//输出a
}
//如果不是数,可以将字符串或字母的位置或者索引映射到整数,依次求n!的全排列,在依次替换回来
求一个集合的所有子集也可以利用这个思想:
将这个集合的所有子集影射到0-2的n次方-1的每一个数ai,
ai用二进制表示为数组,0的位置代表没有,1的位置代表涵盖该元素,逐一影射每一元素。