陣列的全排列

2021-08-15 06:23:57 字數 1258 閱讀 5797

1.問題背景

學過數學的人都知道,全排列的意思是什麼。現在如何用計算機的程式語言實現陣列的全排列呢?

陣列的全排列可用於求解八皇后問題。與此同時,全排列經常會出現在筆試或者面試,如求字串的全排列。

全排列表示把集合中元素的所有按照一定的順序排列起來,使用p(n, n) = n!表示n個元素全排列的個數。p(n, n)中的第乙個n表示元素的個數,第二個n表示取多少個元素進行排列。

給定乙個n個元素陣列,其全排列的過程可以描述如下: 

(1)任意取乙個元素放在第乙個位置,則有n種選擇; 

(2)再剩下的n-1個元素中再取乙個元素放在第二個位置則有n-1種選擇,此時可以看做對n-1個元素進行全排列; 

(3)重複第二步,直到對最後乙個元素進行全排列,即最後乙個元素放在最後乙個位置,全排列結束。

以陣列為例,其全排列的過程如下: 

(1)1後面跟(2,3)的全排列; 

(2)2後面跟(1,3)的全排列; 

(3)3後面跟(1,2)的全排列。

圖示如下:

由於遞迴將問題逐級分解,因此相對比較容易理解,但是需要消耗大量的棧空間,如果函式棧空間不夠,那麼就執行不下去了,而且函式呼叫開銷也比較大。

#include using namespace std;

int sum=0; //全排列個數

//列印陣列內容

void print(int array,int len)為例,如果陣列中有重複的元素,變成了,那麼它的全排列就不能完全按照上面的方法求解,需要做稍微的改動。

因為全排列是將不同元素依次換到當前位置後,再對後面的元素求全排列。如果將重複的元素多次換到當前位置的話,那麼就會出現相同的排列。為了避免,我們禁止將相同的元素多次換到當前位置即可。

例如,對,第乙個數1與第二個數2交換得到212,然後考慮第乙個數1與第三個數2交換,此時由於第三個數等於第二個數,所以第乙個數不再與第三個數交換。再考慮212,它的第二個數與第三個數交換可以得到解決221。此時全排列生成完畢。

這樣我們也得到了在全排列中去掉重複的規則——去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換。

修改後的**如下:

//是否交換

bool isswap(int array,int len,int index){

for(int i=index+1;i

陣列的全排列

學過數學的人都知道,全排列的意思是什麼。現在如何用計算機的程式語言實現陣列的全排列呢?陣列的全排列可用於求解八皇后問題,具體參見 全排列解決八皇后問題。與此同時,全排列經常會出現在筆試或者面試,如求字串的全排列。之所以那它作為考題,因為它難度適中,既可以考察遞迴實現,又能進一步考察非遞迴的實現,便於...

陣列的全排列演算法

求給定陣列的全排列。如 輸入 1,2,3 輸出 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 思路 這裡借用別人的解題思路,我就不重述了 1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從...

輸出陣列全排列

include include using namespace std 輸出陣列全排列 演算法思路 1 n個元素的全排列 n 1個元素的全排列 另乙個元素作為字首 2 出口 如果只有乙個元素的全排列,則說明已經排完,則輸出陣列 3 不斷將每個元素放作第乙個元素,然後將這個元素作為字首,並將其餘元素繼...