遞迴解決全排列生成演算法

2021-06-09 13:54:34 字數 2844 閱讀 6973

排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;

全排列:當n==m時,稱為全排列;

比如:集合的全排列為: 

方法一:

我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;

演算法思路:

(1)n個元素的全排列=(n-1個元素的全排列)+(另乙個元素作為字首);

(2)出口:如果只有乙個元素的全排列,則說明已經排完,則輸出陣列;

(3)不斷將每個元素放作第乙個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

public class test ;

public static void main(string args)

private static void swap(int i1, int i2)

/*** 對arr陣列中的begin~end進行全排列

* * 比如:

* arr =

* 第一步:執行 perm(,0,2),begin=0,end=2;

* j=0,因此執行perm(,1,2),begin=1,end=2;

* j=1,swap(arr,0,0)-->arr=, perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1) --> arr=;

* j=2,swap(arr,1,2)-->arr=, perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* j=1,swap(arr,0,1) --> arr=, perm(,1,2),begin=1,end=2;

* j=1,swap(arr,1,1)-->arr= perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1)--> arr=;

* j=2,swap(arr,1,2)後 arr=,並執行perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* swap(arr,1,0) --> arr=

* j=2,swap(arr,2,0) --> arr=,執行perm(,1,2),begin=1,end=2;

* j=1,swap(arr,1,1) --> arr= , perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,1,1) --> arr=;

* j=2,swap(arr,2,1) --> arr=,並執行perm(,2,2),begin=2,end=2;

* 因為begin==end,因此輸出陣列

* swap(arr,2,1) --> arr=;

* swap(arr,0,2) --> arr=

*

* @param arr

* @param begin

* @param end

*/public static void perm(int arr, int begin,int end)

system.out.println();

return;

} else

} }}

方法二:

public class test2 ;

public static void main(string args)

/*** 陣列變化過程:

* 3 0 0

* 3 2 0

* 3 2 1

* 3 2 0

* 3 0 0

* 3 0 2

* 3 1 2

* 3 0 2

* 3 0 0

* 0 0 0

* 0 3 0

* 2 3 0

* 2 3 1

* 2 3 0

* 0 3 0

* 0 3 2

* 1 3 2

* 0 3 2

* 0 3 0

* 0 0 0

* 0 0 3

* 2 0 3

* 2 1 3

* 2 0 3

* 0 0 3

* 0 2 3

* 1 2 3

* 0 2 3

* 0 0 3

* 0 0 0

* @param m

*/private static void perm(int m) {

if(m==0){

for(int i=0;i

參考文獻:

1.全排列的遞迴演算法實現   

李盤榮2.全排列遞迴演算法在演算法教學中的重要性  

吳素萍3.排序演算法與全排列生成演算法研究 

陳衛東, 鮑蘇蘇

全排列生成演算法

recursive generating 這個演算法接受乙個元素均不同的陣列,通過遞迴的呼叫以生成所有全排列序列。遞迴的原則在於,生成序列的全排列p a1,a2,an 等價於生成序列 這構成了遞迴演算法設計的deduction case 而base case,則是要生成全排列的序列只有乙個元素。整個...

全排列生成演算法

問題 生成1 n的全排列 生成乙個陣列中所有元素的全排列 思想 依據字典序順序,由前乙個排列,生成後乙個排列。字典序方法 輸入前乙個排列,輸出後乙個排列 vector nextpermutation vector p 主呼叫方法 void generatepermutation int n for ...

全排列生成演算法

我們假如有一串式子,排列組合的結果會有很多種,全排列就是按照字典序有序的將所有的排列組合的性質的陳列出來 問題可以這麼描述 對於給定的集合a,其中的n個元素互不相同,如何輸出這n個元素的所有排列 全排列 我們來這麼看這個問題,加入有n個資料要進行全排列,我們可以假想我們面前有n個盒子 每一次我們有大...