全排列算法

题目:对字符串abc进行全排列输出?

题目分析:要从n个不同的元素的所有排列中确定一个最佳的排列。如:a、b、c的排列有
abc、acb、bac、bca、cab、cba即3!个
假设E = {e1,e2,e3,…,en}是n个数的集合,求E的所有排列。令EiE_iEi​表示除去第i个元素eie_iei​ 以后的集合,令perm(X)表示集合X的所组成的所有排列,令eie_iei​.perm(X)表示在perm(X)中的每个排列加上前缀eie_iei​之后的排列表。例如:
E={a,b,c},E1E_1E1​={b,c},perm(E1E_1E1​) = {bc,cb},e1.perm(E1E_1E1​)={abc,acb}。
      当n = 1时,是递归基础部分。这时的集合E只有一个元素e,因此只有一个排列:perm(E) = (e)。当n > 1时,perm(E)是一个表:e1e_1e1​.perm(E1E_1E1​),e2e_2e2​.perm(E2E_2E2​),e3e_3e3​.perm(E3E_3E3​),…,ene_nen​.perm(EnE_nEn​)。这个定义是用n个集合perm(X)来定义集合perm(E),其中每个X包含n-1个元素,它成为递归步骤。既有基础部分又有递归部分,这是一个完整的 递归定义

针对上述分析:可以将abc的排列分为c的排列然后加上b在进行排列,然后在加上a进行排列,所以代码如下所示:

#include <stdio.h>
void swap(char arr[], int i, int k)
{
        char c = arr[i];
        arr[i] = arr[k];
        arr[k] = c;
}

void perm(char arr[], int size,int k)
{
        if (k == size)
        {
               for (int i = 0; i < size; i++)
               {
                       printf("%c ", arr[i]);
               }
               printf("\n");
        }
        else {
               for (int i = k; i < size; i++)
               {                   
                       swap(arr, i, k);
                       perm(arr, size, k + 1);
                       swap(arr, k, i);
               }
        }
}
int main(void)
{
        char arr[3] = { 'a','b','c' };
        perm(arr, 3, 0);
        return 0;
}

全排列算法

全排列算法全排列算法 诸葛云生 发布了18 篇原创文章 · 获赞 1 · 访问量 638 私信 关注
上一篇:Django通用权限设计


下一篇:Error: EACCES: permission denied when trying to install ESLint using npm