算法筆記:全排列的輸出實現

算法核心

最簡單的全排列,好比1,2的全排列是:1,2和2,1,即:1排完了,再排2,理論看很簡單,這也直接指導了相應的算法實現:算法

經過遞歸,第一項從1到n枚舉,相應的第二項從2開始,這其中須要一個散列數組哪些數字被用過了,以避免重複。最後,以最後一個位置的數字做爲遞歸的邊界數組

因此,最終實現:遞歸+散列表(內部for循環)。code

簡單演練了一下,發現只是8位的全排列就多的恐怖:

……
87654213
87654231
87654312
87654321
The total number of 8's Full Permutation is 322560.

核心算法

void generateP(int index) {
    if (index == N + 1) {
        for (int i = 1; i <= N; i++) {
            printf("%d", P[i]);
            countN++;
        }
        printf("\n");
        return;
    }

    //from 1 to ...
    for (int x = 1; x <= N; x++) {
        if (HashTable[x] == false) {
            P[index] = x;
            HashTable[x] = true;
            generateP(index + 1);//
            HashTable[x] = false;
        }
    }
}
相關文章
相關標籤/搜索