全排列演算法 遞迴 字典序實現(Java)

2021-08-17 16:10:10 字數 1565 閱讀 3756

全排列: 

從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。 

例如:1 、2 、3三個元素的全排列為:

,,,,,。

解法1(遞迴)

如下圖:要對1、2、3、4進行排序,第乙個位置上的元素有四種可能:1或2或3或4,假如已經確定了第乙個元素為4,剩下的第二個位置上可以是1、2、3,很顯然這具有遞迴結構,如果原始要排列的陣列順序為1、2、3、4,現在只要分別交換1、2,1、3,1、4然後對剩下的3個元素進行遞迴的排列。

遞迴方法會對重複元素進行交換比如使用遞迴對進行全排序會輸出:,兩個重複的結果。要在排序的時候去掉重複結果,可以修改一下**如下:

public

static

void

permutation(char chs,int start)

for(int i=start;i<=chs.length-1;i++)}}

解法2(字典序法)

字典序法 

對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到右逐個比較對應的字元的先後。 

列如:對a、b、c進行排序的結果是、、、、、 

字典序法的優點是排列的結果按照順序輸出並且對於重複的元素不進行重複排序。

字典排序法的思想:

例如:對元素1,2,3,4進行排序,假設預設的陣列順序為,先輸出第乙個排列:1、2、3、4。然後從右向左找到第乙個非遞增的數,4,3,因為3比4小,交換3、4,並且對3後面的數進行逆序排列,第二個排列為,再從右向左3,4,2,發現2比4小,交換從右向左第乙個比2大的數,交換後再對3後面的數進行逆序排列第三個序列為: 

依次迴圈直到陣列成為完全遞減陣列結束1、2、3、4字典排序的最大序列為。

**

public

void

permutationwithdictionary(char chs)

else

if(j==0)

}

for(j=chs.length-1;j>=0;j--)

swap(chs,index,j);

//交換找到的兩個元素

reverse(chs,index+1);

//對非遞增元素位置後面的陣列進行逆序排列

}

}public

static

void

reverse(char chs,int i)

全排列演算法的字典序排列

之前在中描述了全排列演算法的遞迴解法,這裡再說一種演算法 字典序排列。字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1p2 pn,我們從後往前尋...

全排列 字典序排列

include includeusing namespace std define dig num 4 void cal int str int first int last cout endl if first last bool get f l int list int former int l...

字典序輸出全排列演算法

請編寫程式輸出前nnn個正整數的全排列 n 10n 10n 10 並通過9個測試用例 即nnn從1到9 觀察nnn逐步增大時程式的執行時間。輸入給出正整數nnn 10 10 10 輸出1到nnn的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a1,a2,ana 1 a 2 a ...