全排列演算法和實現

2021-08-27 09:02:32 字數 1246 閱讀 8663

全排列在非常多程式都有應用,是乙個非經常見的演算法,常規的演算法是一種遞迴的演算法,這樣的演算法的得到基於下面的分析思路。  給定乙個具有n個元素的集合(n>=1),要求輸出這個集合中元素的全部可能的排列。

一、遞迴實現

比如,假設集合是,那麼這個集合中元素的全部排列是,顯然,給定n個元素共同擁有n!種不同的排列,假設給定集合是,能夠用以下給出的簡單演算法產生其全部排列,即集合(a,b,c,d)的全部排列有以下的排列組成:

(1)以a開頭後面跟著(b,c,d)的排列

(2)以b開頭後面跟著(a,c,d)的排列

(3)以c開頭後面跟著(a,b,d)的排列

(4)以d開頭後面跟著(a,b,c)的排列,這顯然是一種遞迴的思路,於是我們得到了下面的實現:

#include using namespace std;

void permutation(char* a,int k,int m)

{ int i,j;

if(k == m)

{ for(i=0;i<=m;i++)

cout<二、stl實現

有時候遞迴的效率使得我們不得不考慮除此之外的其它實現,非常多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫已經實現的那些演算法,這讓我們非常輕鬆。stl有乙個函式next_permutation(),它的作用是假設對於乙個序列,存在依照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。實現非常easy,我們看一下**:

#include #include using namespace std;

void permutation(char* str,int length)

{ sort(str,str+length);

do {

for(int i=0;i三、有一定約束條件的全排列

對數1,2,3,4,5要實現全排序。要求4必須在3的左邊,其他的數字置任意。 

思路:首先使用上面的2種方法之中的乙個實現全排列,然後對全排列進行篩選,篩選出4在3左邊的排列。

#include #include using namespace std;

void permutation(int* a,int length)

{ int i,flag;

sort(a,a+length);

do {

for(i=0;i完全**

全排列演算法原理和實現

全排列演算法原理和實現 全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再...

全排列演算法原理和實現

全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...

全排列演算法的實現

今天看書,看到了一道題,是 是劍指offer 裡面的,在這裡貼出來吧 給定乙個數字n,列印從1到最大的n位數。看起來很簡單,但是如果考慮到n的範圍就會複雜起來。所以我的做法是用字串儲存數字,但這樣,數值變化及變得麻煩起來。我借鑑了全排列演算法。所以,在這裡貼出來全排列演算法的 這裡僅僅是遞迴實現的 ...