全排列演算法遞迴實現
阿新 • • 發佈:2018-12-16
前言:
在一些演算法題當中有時需要進行全排列,是一個比較簡單的遞迴呼叫,在這裡記錄下,以後可以直接拿來使用。
過程:
例如{1,2,3,4,5}:
第一步:
{1}和{2,3,4,5}的全排列組合;
{2}和{1,3,4,5}的全排列組合;
{3}和{2,1,4,5}的全排列組合;
…
第二步:
針對{2,3,4,5}這個集合在拆分為:
{2}和{3,4,5}的全排列組合;
{3}和{2,4,5}的全排列組合;
…
之後就是類比如此。
集合中每個元素和剩下元素的全排列的組合。在對這個其餘元素的集合做第一步的分解。
圖示講解:
程式碼如下(C++實現):
#include <iostream> #include <vector> using namespace std; void swap(vector<int>& number,int n,int m){ int temp = number[n]; number[n]=number[m]; number[m]=temp; } void permutation(vector<int>& number,int current){ if(current==number.size()-1){ for(int i=0;i<number.size();i++){ cout<<number[i]; } cout<<endl; } for(int i=current;i<number.size();i++){ swap(number,current,i); //交換位置,第一次沒有交換位置,第二次開始交換位置 permutation(number,current+1); swap(number,current,i); //返回原來的順序,進行下一次交換。 } } int main(void){ int a[5] = {1,2,3,4,5}; vector<int> b(a,a+5); permutation(b,0); }
說的有點亂,大家勉強看看吧。