>n; dfs(1);//从第一个位置开始遍历 return 0; }
二、字典序法
首先字典序法在数学中就是字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法
这也就是前面所解释说明的那样,以数组 [1, 2, 3] 的全排列为例。
以 1 开头的全排列为[1, 2, 3], [1, 3, 2];
以 2 开头的全排列为[2, 1, 3], [2, 3, 1];
最后以 3 开头的全排列为[3, 1, 2], [3, 2, 1];
从上面的全排列可以看出来,开头固定数是从左往右依次增大的,对这就是字典序法
这里找了一张图
代码如下(示例):
/** list就是集合R k 表示list中的开始位置 m 表示list中的结束位置 */ static int[] list={1,2,3}; public static void main(String[] args) { perm(list, 0, list.length-1); } public static void perm(int[] list,int k,int m){ //产生list中第k到m位置上元素的全排列 if(k==m){//只剩一个元素的情况下的全排列,也是递归出口 for(int i=0; i<=m; i++){ System.out.print(list[i]); } System.out.println(); return; }else{ for(int i=k; i<=m; i++){ swap(list,k,i);//将第i个元素和该子序列中的第一个元素进行交换 perm(list,k+1,m);//求解规模为n-1的子问题 swap(list,k,i);//将它换回 } } } public static void swap(int[] list,int k,int i){ //进行交换 int temp = list[k]; list[k] = list[i]; list[i] = temp; }
三、相邻对换法
邻位对换法是全排列生成算法中的其中一种,它的换位是双向的,通过保存数字的“方向性”来快速得到下一个排列
说明:
1、 每个数有一个移动方向,向左或向右。如果数x的移动方向上最靠近它的数比它要小,那么x是可移动的。初始时序列为{1, 2, 3, …, n-1, n},方向都为向左。
2、 移动最大数n,直到不能移动为止,每改变一次位置输出一个序列(此时n在最左边或最右边)。
3、 找当前可移动的最大数m。若能找到,移动m,把所有比m大的数的方向置反,返回第2步;若不能找到,算法停止。
以array={1,2,3,4}的全排列为举例,当我们其中子集合{1,2,3}的全排列为:
123
132
312
321
231
213
这6个数,那么将4排入其中,则过程为这样
代码部分
import java.util.ArrayList; public class Permutation { public static void main( String[] args ) { String[] result = permutation( "12345" ); // System.out.println( result.length + "\r\n" ); for ( String s : result ) { System.out.println( s ); } } public static String[] permutation( String str ) { ArrayList
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者