1. 程式人生 > >全排列遞迴演算法

全排列遞迴演算法

遞迴求全排列演算法:


例如:char a[]=”abc”  ,(i,j,k)表示陣列現有的元素

perm(a,k,m);//從陣列下標km的全排列

k==m 只剩一個元素為遞迴出口


C++原始碼:

#include <iostream>
using namespace std;
/*對陣列元素全排列
如 a[]="abc";
結果為:
abc
acb
bac
bca
cba
cab
*/
int swap(char a[],int i,int j){//交換陣列下標為i和j的元素
    char temp;
    temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    return 0;
}
int perm(char a[],int k,int m){
    if(k==m)
       cout<<a<<endl;
    else{
        for (int i=k;i<=m ;i++) {
            swap(a,k,i);//每個子串的第二個字元起、都分別與第一個字元交換、形成新的a、進行全排列
            perm(a,k+1,m);//除第一個字元外剩下的全排列遞迴
            swap(a,k,i);//恢復還原a[]
            /* code */
        }
           
       }
    return 0;
}

int main() {
    char a[]="abc";
    char *p=a;
    int length=0;
    while(*p!='\0'){
        length++;
        p++;
    }
    
    perm(a,0,length-1);//對陣列a[] 從下標0到length-1全排列

	return 0;
}