Java全排列算法:算法
第一遍循環:將list數組index==0的元素依次與數組的每一個元素交換,從而保證index==0的位置前後出現n個不一樣元素之一,實現對index==0位置的遍歷。數組
第 i 遍循環:經過交換, 使index==i的元素,依次與index 爲[ i, length-1] 的元素交換。使index==i 位置遍歷 length-i 個不一樣值spa
第k 次遍歷,實質上都是讓子列表[ k, length - 1] 的index==0 的位置依次出現length - k 個不一樣的值,並在出現每一個不一樣的值時,遞歸操做子列表[ k+1, length - 1]code
public class Permutation { public static void permulation(int[] list, int start, int length) { int i; if (start == length) { for (i = 0; i < length; i++) System.out.print(list[i] + " "); System.out.println(); } else { for (i = start; i < length; i++) { swap(list, start, i); permulation(list, start + 1, length); swap(list, start, i); } } } public static void swap(int[] list, int start, int i) { int temp; temp = list[start]; list[start] = list[i]; list[i] = temp; } public static void main(String[] args) { int length = 3; int start = 0; int list[] = new int[length]; for (int j = 0; j < length; j++) list[j] = j + 1; permulation(list, start, length); } }
沒有註釋,其實由於我以爲註釋也不太好寫。以list[3]={1,2,3}爲例。blog
1、先是123,而後1與1本身對換,遞歸排列23,2與2本身對換,遞歸排列3,而後3與3對換,再遞歸時知足start==length,即越界,因此把123打印出來;遞歸
而後上一步2與2本身對換後,2與3對換,(暫時是132),遞歸到2與2對換,再遞歸知足start==length,打印132;io
2、最早一步1與1本身對換後,1與2對換,(暫時是213),遞歸排列13,1與1本身對換,遞歸排列3. 3與3本身對換,而後知足If條件打印213:class
而後退一步,1與3對換,(暫時是231),遞歸到1與1本身對換,再遞歸知足打印條件,打印231;循環
3、1與一、2對換後,1最後與3對換,(暫時是321),遞歸排列21,2與2對換,遞歸排列1.1與1本身對換,後來知足打印條件打印321. 2再與1對換,再遞歸到2與2本身對換,後來打印出312.遍歷
寫得比較抽象,但只能這樣了。只可意會,不可言傳~