1. 程式人生 > >全排列遞迴演算法(C++實現)

全排列遞迴演算法(C++實現)

演算法實現思路

遞迴解決問題的方法就是將一個大問題不斷分解成小問題,直到小問題很容易解決為止

先看全排列怎麼分解成小問題:

       假設要全排列“ABC”,先把A作為前部不變,全排列BC,同樣將B作為前部,全排列C,顯然是它本身

於是大問題變成了很容易解決的小問題了

如圖所示

程式碼如下

/*
*  全排列演算法(遞迴實現)
* author RogerNO1
*/
#include <iostream>
#include<string>
using namespace std;

void Permutations(char *pre, int level, char * data,int n)
{
    level++;//遞迴層次增加;
    if(n==1){//要排列的序列長度為1時,列印一種排序
        cout<<pre<<data<<endl;
    }else{
        int i=0;
       while(data[i]!='\0'){
           pre[level-1]=data[i];pre[level]='\0';//前部增長

            char * data2=new char[n-1];//新陣列儲存要排序的後部
            int j,p=0;
            for(j=0;j<n;j++){
                if(i==j)continue;
                data2[p++]=data[j];
            }
            data2[p]='\0';

           Permutations(pre,level,data2,n-1);
            i++;
        }

    }

}
int main()
{
    char * data="ABCD";
    char *pre=new char[4];//pre用來儲存不變的前部 如ABCD,ABDC,AB不變
    int level=0;//遞迴的層次
    Permutations(pre,level,data,4);

    return 0;
}