演算法筆記之 全排列演算法 一 遞迴求解
阿新 • • 發佈:2019-01-05
集合R={1,2,3,4}的全排列
可以分解為:1,{2,3,4}的全排列 + 2,{1,3,4}的全排列 + 3,{1,2,4}的全排列 + 4,{1,2,3}的全排列。
繼續分解:{2,3,4} 為 2,{3,4}的全排列,3,{2,4}, 4,{2,3}………………………………
…………
直到集合裡只有一個元素,就可直接輸出了.
#include <iostream> using namespace std; //char * str; //int len = 2; /** *產生list[start:end]的所有排列, 通常為0,len-1 */ template <class Type> void Perm(Type list[],int start,int end){ //單元素序列 if( start == end){ //即此時集合裡只有一個元素 for(int i=0; i<=end; i++) cout << list[i]; cout << endl; } //多元素序列,遞迴產生排列 else{ for(int i= start; i<= end; i++){ Swap(list[start], list[i]);//交換可得:1,{2,3,4} ; 2,{1,3,4}; 3,{1,2,4}; 4,{1,2,3} Perm(list, start+1, end); Swap(list[start], list[i]);//輸出排列之後,要再交換回到初始狀態:{1,2,3,4} } } } template <class Type> inline void Swap(Type &a, Type &b){ Type temp = a; a = b; b = temp; } int main() { char str[] = "abcd"; Perm(str, 0,3); //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; }
輸出:
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc