C#算法之全排列递归算法实例讲解

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;

全排列:当n==m时,称为全排列;

比如:集合{ 1,2,3}的全排列为:

{ 1 2 3}

{ 1 3 2 }

{ 2 1 3 }

{ 2 3 1 }

{ 3 2 1 }

{ 3 1 2 }

我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致;

算法思路:

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

这里先把集合中的元素理解为不会出现重复了,那么实现的方法(C++)如下:

成员管理,互评,文件共享,事务通知

#include <iostream>

using namespace std;

int sum = 0;//记录有多少种组合

void Swap(char str[], int a, int b)

{

    char temp = str[a];

    str[a] = str[b];

    str[b] = temp;

}

void Perm(char str[], int begin, int end)

{

    if (begin == end)

    {

        for (int i = 0; i <= end; i++)

        {

            cout << str[i];

        }

        cout << endl;

        sum++;

        return;

    }

    else

    {

        for (int j = begin; j <= end; j++)

        {

            Swap(str, begin, j);

            Perm(str, begin + 1, end);

            Swap(str, j, begin);

        }

    }

}

int main()

{

    int n;

    char c[16];

    char tmp;

    cin >> n;

    tmp = getchar();    // 接受回车

    if (1 <= n && n <= 15) {

        for (int i = 0; i < n; i++) {

            c[i] = getchar();

        }

        Perm(c, 0, n - 1);

    }

    cout << sum;

    cout << endl;

    return 0;

}

以上是 C#算法之全排列递归算法实例讲解 的全部内容, 来源链接: utcz.com/z/347023.html

回到顶部