標籤:
第一步,排列的精髓是交換和順序處理,比如,考慮[1,2,3,4]排列,實際上是,1和1,2,3,4分別交換得來
1和1交換:[1],[2,3,4]
1和2交換:[2],[1,3,4]
1和3交換:[3],[2,1,4]
1和4交換:[4],[2,3,1]
那麼下面分別考慮上面的四個結果,比如,考慮
[1],[2,3,4]
第二步,我們把[1]固定不變,考慮[2,3,4],把它看成是2和2,3,4分別交換,得到如下結果:
[1]固定,2和2交換:[1],[2],[3,4]
[1]固定,2和3交換:[1],[3],[2,4]
[1]固定,2和4交換:[1],[4],[3,2]
這個時候,再分別考慮第二步之後的三個結果,比如,考慮
[1],[2],[3,4]
第三步,我們把[1],[2]固定不變,考慮[3,4],把它看成是3和3,4分別交換,得到如下結果:
[1][2]固定,3和3交換:[1],[2],[3],[4]
[1][2]固定,3和4交換:[1],[2],[4],[3]
從上面分析可以看出,其實第二步就是對第一步的部分遞迴,同樣,第三步也是對第二步的部分遞迴,當最右邊只有一個數位時候,我們就進行輸出
代碼:
import java.util.Arrays;/** * * <p> * ClassName MyPermutation * </p> * <p> * Description 排列, * </p> * * @author TKPad [email protected] * <p> * Date 2015年3月20日 下午9:48:02 * </p> * @version V1.0.0 * */// 從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。public class MyPermutation { // 交換兩個數 public void swap(int nums[], int i, int j) { if (i == j) { return; } int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } public void permutation(int nums[], int start, int end) { if (start == end) { // 直接輸出 System.out.println(Arrays.toString(nums)); } else { // 遞迴調用 for (int i = start; i < end; i++) { swap(nums, start, i);// 開始交換 permutation(nums, start + 1, end); swap(nums, i, start);// 將數組恢複原狀 } } } public static void main(String[] args) { int nums[] = new int[] { 1, 2, 3, 4 }; System.out.println("全排列:"); new MyPermutation().permutation(nums, 0, nums.length); }}
全排列演算法-Java