求一个数组的全排列算法

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

发布了7 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/javadeaihaozhe/article/details/46273537