求一个数组的全排列算法

来源于离散数学基础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的位置代表涵盖该元素,逐一影射每一元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值