全排列算法

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

题目分析:要从n个不同的元素的所有排列中确定一个最佳的排列。如:a、b、c的排列有
abc、acb、bac、bca、cab、cba即3!个
假设E = {e1,e2,e3,…,en}是n个数的集合,求E的所有排列。令 E i E_i Ei表示除去第i个元素 e i e_i ei 以后的集合,令perm(X)表示集合X的所组成的所有排列,令 e i e_i ei.perm(X)表示在perm(X)中的每个排列加上前缀 e i e_i ei之后的排列表。例如:
E={a,b,c}, E 1 E_1 E1={b,c},perm( E 1 E_1 E1) = {bc,cb},e1.perm( E 1 E_1 E1)={abc,acb}。
      当n = 1时,是递归基础部分。这时的集合E只有一个元素e,因此只有一个排列:perm(E) = (e)。当n > 1时,perm(E)是一个表: e 1 e_1 e1.perm( E 1 E_1 E1), e 2 e_2 e2.perm( E 2 E_2 E2), e 3 e_3 e3.perm( E 3 E_3 E3),…, e n e_n en.perm( E n E_n En)。这个定义是用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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值