全排列算法递归实现(Permutations)

题目解释

全排列(Permutations),对输入的字符排列出所有可能的组合。例如,输入“123”,输出:

123
132
213
231
321
312

题目思路

输入一个字符,直接输出就好;输入两个字符,轮流先输出其中一个字符再输出另一个;输入三个字符,轮流输出其中两个字符再输出另外一个字符;……

由此可以发现,当n > 1时,我们输入n个字符的时候,可以轮流输出其中n-1个字符再输出剩下的那个字符,也就是n个字符的全排列是建立在n-1个字符全排列的基础上。

输入字符数 输入的字符 输出的情况
1 1 1(直接输出)
2 1,2 {1位数字} + 1/2
3 1,2,3 {2位数字} + 1/2/3
4 1,2,3,4 {3位数字} + 1/2/3/4

显然,选择递归实现是最省心实惠的好办法。

具体代码

void swap(char *a, char *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

void permutation(char *a, int first, int last) {
    if (first == last) {
        // 一位数字,直接输出
        for (int i = 0; i <= last; i++) {
            printf("%c", a[i]);
        }
        putchar('\n');
    }
    else {
        // 从头遍历所有的字符
        for (int i = first; i <= last; i++) {
            // 交换成为第一个字符
            swap(&a[i], &a[first]);
            permutation(a, first + 1, last);
            swap(&a[i], &a[first]);
        }
    }
}

测试代码

#include 
void test() {
    printf("---test1---\n");
    char str1[] = "1";
    permutation(str1, 0, 0);

    printf("---test2---\n");
    char str2[] = "12";
    permutation(str2, 0, 1);

    printf("---test3---\n");
    char str3[] = "123";
    permutation(str3, 0, 2);

    printf("---test4---\n");
    char str4[] = "1234";
    permutation(str4, 0, 3);

    printf("---test5---\n");
    char str5[] = "1234567";
    permutation(str5, 0, 6);


    printf("Done!\n");
}

int main() {
    test();
}

本文参考自博客:全排列算法及实现

你可能感兴趣的:(算法作业)