zoukankan      html  css  js  c++  java
  • java实现全排列

    方法一:利用递归实现

    // 方法一:递归实现全排列
    	public static void perm(char[] buf, int start, int end) {
    		char temp = ' ';
    		if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
    			for (int i = 0; i <= end; i++) {
    				System.out.print(buf[i] + " ");
    			}
    			System.out.println();
    		} else {// 多个字母全排列
    			for (int i = start; i <= end; i++) {
    				temp = buf[start];// 交换数组第一个元素与后续的元素
    				buf[start] = buf[i];
    				buf[i] = temp;
    				perm(buf, start + 1, end);// 后续元素递归全排列
    				buf[i] = buf[start]; // 将交换后的数组还原
    				buf[start] = temp;
    			}
    		}
    	}
    

      

    // 方法二
    // 可以使用递回将问题切割为较小的单元进行排列组合,例如1 2 3 4的排列可以分为
    // 1 [2 3 4],2[1 3 4],3[1 2 4],4[1 2 3]进行排列,利用旋转法,先将旋转间隔设为0,
    // 将最右边的数字旋转至最左边,并逐步增加旋转的间隔,例如
    // 1 2 3 4 --> 旋转1 --> 继续将右边2 3 4进行递回处理
    // 2 1 3 4 --> 旋转1 2 变为 2 1 --> 继续将右边1 3 4 进行递回处理
    // 3 1 2 4 --> 旋转1 2 3变为3 1 2 --> 继续将右边1 2 4进行递回处理
    // 4 1 2 3 --> 旋转1 2 3 4 变为4 1 2 3 --> 继续将右边1 2 3 进行递回处理

    public static void perm(int[] num, int i) { // i为第几层
    		if (i < num.length) { // 小于总层就旋转,旋转间隔从0开始
    			for (int j = i; j < num.length; j++) {
    				int tmp = num[j];
    				// 旋转该区段最右边的数字到最左边
    				for (int k = j; k > i; k--) {
    					num[k] = num[k - 1];
    				}
    				num[i] = tmp;
    				perm(num, i + 1);
    
    				// 还原
    				for (int k = i; k < j; k++) {
    					num[k] = num[k + 1];
    				}
    				num[j] = tmp;
    			}
    		} else { // 最后一层的时候打印
    			// 显示此次排序
    			for (int j = 0; j < num.length; j++) {
    				System.out.print(num[j] + " ");
    			}
    			System.out.println();
    		}
    	}
    

      

  • 相关阅读:
    junit源码解析--测试驱动运行阶段
    junit源码解析--初始化阶段
    junit源码解析--核心类
    junit测试套件
    junit参数化测试
    junit忽略测试方法
    Junit4常用注解
    泛型技术
    在使用Java8并行流时的问题分析
    Linux 常用性能分析命令
  • 原文地址:https://www.cnblogs.com/cugb-2013/p/3634531.html
Copyright © 2011-2022 走看看