**:
這個講解的非常通俗易通,所以記錄下來備用。
先大體介紹一下演算法思路:
比如說有1234四個數字,我們要將這四個數字實現全排列。拋棄初中老師教我們的4×3×2×1的思路,我們來換一種思路。「1234」當然是第乙個排列,要得到第二個排列,我們選取剛好比它大的,我們用大腦當然想的到是「1243」,但是我們怎樣解釋給機器聽呢?我們可以這樣解釋:
1.從後往前尋找,即沿著4->3->2->1的方向尋找,直到找到某乙個數,它比後面的那個數字小。在「1234」中,我們找到了3,因為3比4小,然後我們將3和4交換就得到比剛好比"1234"大的乙個新全排列為"1243".
2.那麼依據這個思路真的對麼。答案是否定的。比如:在某乙個時間,我們產生了乙個新的排列:「2143」.依據剛才的思路,我們很容易找了1比4小,然後我們將1和4交換了,得到「2413」.這真的是剛好比「2143」大的全排列麼?答案是不是,當然是「2314」.所以我們不是讓1和緊挨著他的4交換,而是應該然個1和其後最小的比1大的數交換,「4」和「3」,剛好比「1」大的數字應該是3,所以,我們讓「1」和「3」交換,得到「2341」.
3.接著,我們發現還是不對,應該是「2314」啊。。結果是當然的,交換後,「3」這個位置以後的數,當然都是從大到小排列的。。我們只要做一次,反向操作就好了。。即將「41」反向,變為「14」。。好了,我們就得到「2314」了。。
#include using namespace std;
//交換函式
void swaparray(int &a,int &b)
//列印出排列
void printarray(int *fullarray,int number)
}//交換第乙個比其後的數小的數和剛好比這個數大的數
swaparray(fullarray[tempminnum],fullarray[currentnum]);
int i,j;
//反向操作
for (i=currentnum+1,j=lastnum;i>number;
int * fullarray = new int[number];//動態生成全排列的陣列
//初始化
for (int i=0;i
#include using namespace std;
//交換函式
void swaparray(int &a,int &b)
//列印出排列
void printarray(int *fullarray,int number)
}//交換第乙個比其後的數小的數和剛好比這個數大的數
swaparray(fullarray[tempminnum],fullarray[currentnum]);
int i,j;
//反向操作
for (i=currentnum+1,j=lastnum;i>number;
int * fullarray = new int[number];//動態生成全排列的陣列
//初始化
for (int i=0;iprintarray(fullarray,number);//列印出排列。
while (nextstring(fullarray,number) == true)
cout<<"total = "<}
全排列 非遞迴
description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...
全排列演算法的遞迴與非遞迴實現
對於給定的集合a,其中的n個元素互不相同,如何輸出這n個元素的所有排列 全排列 例如 給定集合 1,2,3 它的全排列子集為 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 思路 1.保持第乙個數不變,對後面的數進行全排列 2.將第乙個數換成其它數,對後面的數進行全排列 3....
組合與全排列非遞迴演算法
組合與全排列非遞迴演算法 浩天 二進位制組合演算法 思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同...