全排列的另一种实现方法:旋转法

基本思路如下(以1234为例):
既然说是旋转法,那么它递归的就是旋转
旋转的规则如下:全部左移一位,但最左的移到最右
1234 -> 2341 -> 3412 -> 4123,4位的旋转完成了吧

递归,简单的思路就是从大变小,4位的旋转完成了,就是3位的旋转了,大概过程如下表格

四位的旋转第一位不动
后三位的旋转
前两位不动
后二位的旋转
一位直接返回最终的结果
123423434 12341234
  43 12431243
 42323 14231423
  32 14321432
 34242 13421342
  24 13241324

思路清晰了吧

下方即是代码

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4.  * 
  5.  * 要点1:递归 + 旋转
  6.  * 要点2:n长度的数组,经过n次旋转,会变成原来的数组
  7.  * 
  8.  * @author Daniel You
  9.  * @since 2008-8-22
  10.  */
  11. public class Permutation {
  12.     // 要排列的数组大小
  13.     private int size;
  14.     // 要排列的数组
  15.     private int[] array;
  16.     // 结果集合
  17.     private List<int[]> list = new ArrayList<int[]>();
  18.     // 构造方法,未做异常处理
  19.     // TODO
  20.     public Permutation(int[] array) {
  21.         this.array = array;
  22.         this.size = array.length;
  23.     }
  24.     // 开始计算的入口点
  25.     public void begin() {
  26.         this.permutation(size);
  27.     }
  28.     // 获得结果
  29.     public List<int[]> result() {
  30.         return list;
  31.     }
  32.     /** 
  33.      * 
  34.      * 这个就是该排列重点,递归
  35.      * 
  36.      * @param newSize
  37.      */ 
  38.     private void permutation(int newSize) {
  39.         if (newSize == 1) {
  40.             // 如果最后一位了,直接加到结果集了
  41.             add();
  42.             return;
  43.         }
  44.         for (int j = 0; j < newSize; j++) {
  45.             permutation(newSize - 1);
  46.             rotate(newSize);
  47.         }
  48.     }
  49.     // 添加到结果集合
  50.     private void add() {
  51.         int[] temp = new int[size];
  52.         System.arraycopy(array, 0, temp, 0, size);
  53.         list.add(temp);
  54.     }
  55.     /**
  56.      * 重点之二:旋转
  57.      * @param newSize
  58.      */
  59.     private void rotate(int newSize) {
  60.         int j;
  61.         int position = size - newSize;
  62.         int temp = array[position];
  63.         for (j = position + 1; j < size; j++) {
  64.             array[j - 1] = array[j];
  65.         }
  66.         array[j - 1] = temp;
  67.     }
  68.     public static void main(String[] args) {
  69.         int[] is = { 1234 };
  70.         Permutation p = new Permutation(is);
  71.         p.begin();
  72.         List<int[]> result = p.result();
  73.         for(int[] i : result){
  74.             p(i);
  75.         }
  76.     }
  77.     // 测试方法,打印一个数据
  78.     private static void p(int[] i) {
  79.         System.out.printf("%d%d%d%d/n", i[0], i[1], i[2], i[3]);
  80.     }
  81. }







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值