A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雀巢咖啡 中级黑马   /  2014-4-18 10:44  /  809 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package javabasicgrammar;
  2. 整理了一些关于用递归算法对数组进行全排列,希望对你们有用。
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;

  6. // 1.================================================================
  7. // 排列组合数字
  8. public class Permutation {
  9.     // 方法一
  10.     public static void perm(char[] buf, int start, int end) {
  11.         if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
  12.             for (int i = 0; i <= end; i++) {
  13.                 System.out.print(buf[i]);
  14.             }
  15.             System.out.println();
  16.         } else {// 多个字母全排列
  17.             for (int i = start; i <= end; i++) {
  18.                 char temp = buf[start];// 交换数组第一个元素与后续的元素
  19.                 buf[start] = buf[i];
  20.                 buf[i] = temp;

  21.                 perm(buf, start + 1, end);// 后续元素递归全排列

  22.                 // temp = buf[start];// 将交换后的数组还原
  23.                 // buf[start] = buf[i];
  24.                 // buf[i] = temp;
  25.                 buf[i] = buf[start]; // 将交换后的数组还原
  26.                 buf[start] = temp;
  27.             }
  28.         }
  29.     }

  30.     // 方法二
  31.     // 可以使用递回将问题切割为较小的单元进行排列组合,例如1 2 3 4的排列可以分为
  32.     // 1 [2 3 4],2[1 3 4],3[1 2 4],4[1 2 3]进行排列,利用旋转法,先将旋转间隔设为0,
  33.     // 将最右边的数字旋转至最左边,并逐步增加旋转的间隔,例如
  34.     // 1 2 3 4 --> 旋转1 --> 继续将右边2 3 4进行递回处理
  35.     // 2 1 3 4 --> 旋转1 2 变为 2 1 --> 继续将右边1 3 4 进行递回处理
  36.     // 3 1 2 4 --> 旋转1 2 3变为3 1 2 --> 继续将右边1 2 4进行递回处理
  37.     // 4 1 2 3 --> 旋转1 2 3 4 变为4 1 2 3 --> 继续将右边1 2 3 进行递回处理
  38.     public static void perm(int[] num, int i) { // i为第几层
  39.         if (i < num.length) { // 小于总层就旋转,旋转间隔从0开始
  40.             for (int j = i; j < num.length; j++) {
  41.                 int tmp = num[j];
  42.                 // 旋转该区段最右边的数字到最左边
  43.                 for (int k = j; k > i; k--) {
  44.                     num[k] = num[k - 1];
  45.                 }
  46.                 num[i] = tmp;

  47.                 perm(num, i + 1);

  48.                 // 还原
  49.                 for (int k = i; k < j; k++) {
  50.                     num[k] = num[k + 1];
  51.                 }
  52.                 num[j] = tmp;
  53.             }
  54.         } else { // 最后一层的时候打印
  55.             // 显示此次排序
  56.             for (int j = 0; j < num.length; j++) {
  57.                 System.out.print(num[j] + " ");
  58.             }
  59.             System.out.println();
  60.         }
  61.     }

  62.     // 方法三
  63.     private static void sort(List datas, List target) {
  64.         if (target.size() == 3) { // 这个3表示要对几个字符进行全排列
  65.             for (Object obj : target)
  66.                 System.out.print(obj);
  67.             System.out.println();
  68.             return;
  69.         }
  70.         for (int i = 0; i < datas.size(); i++) {
  71.             List newDatas = new ArrayList(datas);
  72.             List newTarget = new ArrayList(target);
  73.             newTarget.add(newDatas.get(i));
  74.             newDatas.remove(i);
  75.             sort(newDatas, newTarget);
  76.         }
  77.     }

  78.     public static void main(String[] args) {
  79.         // ==========================================
  80.         // int[] num = new int[4 + 1];
  81.         // for (int j = 1; j <= num.length - 1; j++) {
  82.         // num[j] = j;
  83.         // }
  84.         // perm(num, 1);
  85.         int[] num = { 1, 2, 3 };
  86.         perm(num, 0);
  87.         // ==========================================
  88.         System.out.println();
  89.         char buf[] = { 'a', 'b', 'c' };
  90.         perm(buf, 0, buf.length - 1);
  91.         // ==========================================
  92.         System.out.println();
  93.         String[] datas = new String[] { "a", "b", "c" };
  94.         sort(Arrays.asList(datas), new ArrayList());
  95.     }
  96. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马