计算并列出所有排列
递归算法 递归算法简短而神秘。 它是通过呼叫访问(0)执行的。 全局变量级别 初始化为-1,而数组Value的每个条目都初始化为0。 无效访问(int k) { 级别=级别+1; 值[k]=级别;//= 是赋值 如果(级别==N)//==是比较 AddItem();// 到列表框 其他的 for(int i=0;i<N;i++) if(值[i]==0) 访问(i); 级别=级别1; 值[k]=0; } 无效AddItem() { //从值[0]、值[1]…形成字符串。。。 值[N-1]。 //此时,该数组包含一个完整的置换。 //该字符串将添加到列表框中以进行显示。 //因此,函数对算法来说是至关重要的。 } 手动尝试此算法,以确保您理解其工作原理。 词汇顺序和下一个排列 置换 f位于 词典编纂的 (字母)顺序 若(iff) 对于k的最小值,使得f(k)≠g(k),我们得到f(k。 从所有i的相同置换f(i)=i开始,第二个算法按字典顺序生成顺序置换。 算法描述见[ 迪杰斯特拉 ,第71页]。 无效getNext() { int i=N-1; while(值[i-1]>=值[i]) i=i-1; int j=N; while(值[j-1]<=值[i-1]) j=j-1; 掉期(i-1,j-1);// 交换位置(i-1)和(j-1)的值 i++; j=N; 而(i<j) { 掉期(i-1,j-1); i++; j——; } } B.希普算法 Heap的简洁算法是作为递归方法HeapPermute实现的[ 列维京 ,第179页]。 使用调用它 堆置换(N)。 无效堆权限(int n) { 如果(n==1) AddItem(); 其他{ for(int i=0;i<n;i++) 堆Permute(n-1); 如果(n%2==1)//如果n是奇数 掉期(0,n-1); else//如果n是偶数 掉期(i,n-1); }
参考
A.莱维汀, 算法设计与分析导论 ,Addison Wesley,2003年 E.W.Dijkstra, 程序设计学科 ,普伦蒂斯·霍尔,1997年[传真](平装本) R.Sedgewick, C语言中的算法 ,Addison-Wesley,第3版(2001年8月31日)
突变