Java遞迴全排列
阿新 • • 發佈:2021-02-04
Java遞迴全排列
目錄
1, 全排列實現思路
排列組合概念
排列,就是指從給定n個數的元素中取出指定m個數的元素,進行排序
組合,則是指從給定n個數的元素中僅僅取出指定m個數的元素,不考慮排序
全排列就是從“第一個字元”起,“每個字元”分別與它“後面的字元”交換,複雜度為O(n!)
理解
- A依次和BCD交換
- 交換一次後不急(如先進行A跟B交換後有,不急著交換AC、AD,先變成BACD),target後移,再依次交換
- 直到target=最後一個數時,停止,輸出
- 返回上一步(用遞迴)接著做,此時要注意,把換了的數再還回來
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]
總結:
理解全排列遞迴的過程,並不直觀。實現相對來說是比較簡單的,主要是理解了。後面有機會把理解寫得清楚一些。