使用C语言怎么实现一个全排列算法模板

  介绍

使用C语言怎么实现一个全排列算法模板?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>程序的主要思路是:

1。把第1个数换到最前面来(本来就在最前面),准备打印1 xx,再对后两个数2和3做全排列。

2。把第2个数换到最前面来,准备打印2 xx,再对后两个数1和3做全排列。

3。把第三个数换到最前面来,准备打印3 xx,再对后两个数1和2做全排列。

可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述基本情况怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组一的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。

<强>解题过程:

1。当N=1的时候,则直接打印数列即可。

2。当N=2的时候,设数组为[a, b]

,,,,,,,,,,,打印[0],一个[1](即a, b)

,,,,,,,,,,,交换[0],一个[1]里面的内容

,,,,,,,,,,,打印[0],一个[1],,(此时已变成了[b])

3。当N=3的时候,数组为(a, b, c)

3.1把放在一个[0]的位置(原本也是如此,[0]=[0]),打印b, c的全排列(即[1]、[2]的全排列)

3.2 b把放在一个[0]的位置(这时候需要交换原数组的[0]和[1]),然后打印,c的全排列,打印完后再换回原来的位置,即一个还是恢复到[0],b还恢复到一个[1]的位置

,,,,, 3.3把c放在一个[0]的位置(这时候需要交换的是原数组的[0]和[2]),然后打印a, b的全排列,打印完后再换回原来的位置,即一个还是恢复到[0],b还恢复到一个[1]的位置

至此,全排列完成

当N=4、5、6……的时候,以此类推。

# include  & lt; stdio.h>   ,/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//*,功能:实现两个整形参数值交换/*,参数:/*,,,,lh, int类型的指针,指向待交换数1的地址/*,,,,rhs——int类型的指针,指向待交换数2的地址/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */void 交换(int  * lh, int  * rhs)   {   ,int  t =, *韩;   ,   ,* lhs =, * rhs;   ,* rhs =, t;   }   ,/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//*,功能:实现全排列功能/*,参数:/*,,,,来源——整数数组,存放需要全排列的元素/*,,,,begin ——查找一个排列的开始位置/*,,,,最终获得,——查找一个排列的结束位置,当开始=结束时,表明完成一个排列/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */void  FullPermutation (int 源[],int 开始,int 结束)   {   ,int 我;   ,   ,if  (begin 祝辞=,结束),//,找到一个排列   ,{   ,for (小姐:=,0;,小姐:& lt;,,,我+ +)   ,{   ,,printf (“% d",,来源[我]);   ,}   ,printf (“\ n");   ,}   ,//还没有找完一个排列,则继续往下找下一个元素   ,{   ,for (小姐:=,开始,,小姐:& lt;,,,我+ +)   ,{   if 才能;(begin  !=,我)   {才能   交换才能(和源[开始],和源[我]);,//,交换   ,,}   ,//才能,递归排列剩余的+ 1从开始到结束的元素   FullPermutation才能(源,begin  +, 1,);   ,   if 才能;(begin  !=,我)   {才能   交换才能(和源[开始],和源[我]);,//,回溯时还原   ,,},   ,}   ,}   }   ,   int  main ()   {   [30],int 来源;   ,int 我,计数;   ,   ,scanf (“% d",,,数量);   ,   ,//初始化数组   ,for (小姐:=,0;,小姐:& lt;,计数;,我+ +)   ,{   ,源[我]=,小姐:+,1;   ,}   ,   ,FullPermutation(源,,0,,数量);   ,   ,return  0;   }

看完上述内容,你们掌握使用C语言怎么实现一个全排列算法模板的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

使用C语言怎么实现一个全排列算法模板