1. 程式人生 > 其它 >Java遞迴全排列

Java遞迴全排列

技術標籤:javajava遞迴演算法數學

Java遞迴全排列

目錄

1, 全排列實現思路

排列組合概念

理解

2,全排列的重點

3,全排列java實現

Java:

結果:

總結:


1, 全排列實現思路

排列組合概念

排列,就是指從給定n個數的元素中取出指定m個數的元素,進行排序

https://images2017.cnblogs.com/blog/124398/201712/124398-20171216012242168-1277603008.png

組合,則是指從給定n個數的元素中僅僅取出指定m個數的元素,不考慮排序

https://images2017.cnblogs.com/blog/124398/201712/124398-20171216012301574-1912634832.png

全排列就是從“第一個字元”起,“每個字元”分別與它“後面的字元”交換,複雜度為O(n!)

理解

  1. A依次和BCD交換
  2. 交換一次後不急(如先進行A跟B交換後有,不急著交換AC、AD,先變成BACD),target後移,再依次交換
  3. 直到target=最後一個數時,停止,輸出
  4. 返回上一步(用遞迴)接著做,此時要注意,把換了的數再還回來

2,全排列的重點

全排列難的是怎麼理解這個過程;確實也不怎麼好理解。

// 2 先進行交換

swapIndex(array, index, i);

// 3. 遞迴

fullPermutation(array, index + 1);

// 5. 返回上層,交換換回來

swapIndex(array, index, i);


3,全排列java實現

Java:

public class FullPermutationT {

 public static void main(String[] args) {
// Integer[] array = {1,2,3,4,5};
// // 1.從0開始
// fullPermutation(array, 0);

 String[] strArr = {"A","B","C", "D"};
 // 1.從0開始
 fullPermutation(strArr, 0);

 }

 public static <T> void fullPermutation(T[] array, int index) {

 if (index == array.length) {
 // 4.停止,進行輸出
 System.out.println(Arrays.toString(array));
 return;
 }

 for (int i = index; i < array.length; i++) {
 // 2 先進行交換
 swapIndex(array, index, i);
 // 3. 遞進 target 往後移動
 fullPermutation(array, index + 1);
 // 5. 返回上層,交換換回來
 swapIndex(array, index, i);
 }
 }

 /**
 * 交換arr中i和j的值
 * @param array
 * @param i
 * @param j
 */

 public static <T> void swapIndex(T[] array, int i, int j) {
 T temp = array[i];
 array[i] = array[j];
 array[j] = temp;
 }

}

結果:

[A, B, C, D]

[A, B, D, C]

[A, C, B, D]

[A, C, D, B]

[A, D, C, B]

[A, D, B, C]

[B, A, C, D]

[B, A, D, C]

[B, C, A, D]

[B, C, D, A]

[B, D, C, A]

[B, D, A, C]

[C, B, A, D]

[C, B, D, A]

[C, A, B, D]

[C, A, D, B]

[C, D, A, B]

[C, D, B, A]

[D, B, C, A]

[D, B, A, C]

[D, C, B, A]

[D, C, A, B]

[D, A, C, B]

[D, A, B, C]

總結:

理解全排列遞迴的過程,並不直觀。實現相對來說是比較簡單的,主要是理解了。後面有機會把理解寫得清楚一些。