递归+字典序法全排列(java实现)
来源:互联网 发布:sql中left join的用法 编辑:程序博客网 时间:2024/06/17 19:01
1.递归
package cn.edu.ccnu.cs;import java.util.Scanner;public class Arrangement_dfs { int ans; public int[] vis; public int[] num; public int[] a; public void dfs(int x,int n){ if(x==n){ for(int i=0;i<n;i++){ System.out.print(num[i]+" "); } System.out.println(); this.ans++; }else{ for(int i=0;i<n;i++){ if(this.vis[i]==0){ this.num[x]=this.a[i]; this.vis[i]=1; dfs(x+1,n); this.vis[i]=0; } } } return ; } public Arrangement_dfs(){ } public Arrangement_dfs(int length){ this.vis=new int[length]; this.num=new int[length]; this.a=new int[length]; } public static void main(String[] args) { int n; Scanner cin = new Scanner(System.in); n=cin.nextInt(); Arrangement_dfs per=new Arrangement_dfs(n); for(int i=0;i<n;i++){ per.a[i]=i+1; } per.ans=0; per.dfs(0, n); System.out.println(per.ans); cin.close(); }}
2.字典序法
package cn.edu.ccnu.cs;import java.util.Scanner;public class Arrange_main { /**检查是否是最后一个序列*/ public static boolean Check(int[] num){ int n=num.length; for(int i=0;i<n;i++){ if(num[i]!=n-i){ return true; } } return false; } /**输出数组*/ public static void Print(int[] num){ for(int i=0;i<num.length;i++){ System.out.print(num[i]+" "); }System.out.println(); } /**字典序法 生成下一个排列*/ public static void nextPermutation(int[] num) { if(num==null || num.length==0){ return; } int i=num.length-2; while(i>=0 && num[i]>=num[i+1]){ //从右往左找第一个非递增的数 i--; } if(i>=0){ int j=i+1; while(j<num.length && num[j]>num[i]){// 尾部递增序列找小于i位置最近的数 j++; } j--; int temp=num[i]; num[i]=num[j]; num[j]=temp; } reverse(num,i+1);//逆转i+1-num.length 之后的数 Print(num); } public static void reverse(int[] num,int index){ int l=index; int r=num.length-1; while(l<r){ int temp=num[l]; num[l]=num[r]; num[r]=temp; l++; r--; } } public static void main(String[] args){ Scanner cin=new Scanner(System.in); int n; n=cin.nextInt(); int[] list=new int[n]; for(int i=0;i<n;i++){ list[i]=i+1; } long now; now=System.currentTimeMillis(); long ans=0; Print(list); do{ ans++; nextPermutation(list); }while(Check(list)); System.out.println("number of arrangement is "+(ans+1)+" and time cast:"+(System.currentTimeMillis()-now)); cin.close(); }}
阅读全文
0 0
- 递归+字典序法全排列(java实现)
- 实现全排列的两种算法:字典序列法以及递归算法(java)
- 笔试面试算法经典--全排列算法-递归&字典序实现(Java)
- 全排列算法(字典序,递归实现)
- 递归实现全排列,字典序法实现全排列
- 递归实现全排列(java版)
- 全排列(递归和字典序)
- 递归字典排列
- java 全排列 递归实现
- java递归实现全排列
- java递归,实现求全排列
- java递归实现全排列
- Java递归实现全排列
- Java 递归实现全排列
- 全排列实现(递归,去重复,字典排序,stl实现)
- 全排列--字典序列、递归方法c语言实现
- 全排列的实现方法--递归&字典序
- JavaShowAlgorithm-全排列算法递归和字典序实现
- python读取TXT提示问题
- bzoj2654: tree
- jQuery DataTables添加可复用的页面跳转
- ASP MVC5.0 XML存取数据的登录程序(1) 注册部分
- Linux常见问题
- 递归+字典序法全排列(java实现)
- 第七届蓝桥杯决赛 凑平方数 【简单写法+20多行代码】
- Java 爬取信息存入数据库
- SSL2298 饥饿的牛(dp)
- Sitemesh 3 的使用及配置
- 快速幂( O(log n) )
- 布局别名
- Unity——Rigidbody实现真实的物体旋转效果/解决物体添加刚体后不随父物体移动/hingejoint
- 总体性能——渲染模块性能