补充全排列算法C语言实现

补充全排列算法C语言实现

ID:39529966

大小:18.51 KB

页数:5页

时间:2019-07-05

补充全排列算法C语言实现_第1页
补充全排列算法C语言实现_第2页
补充全排列算法C语言实现_第3页
补充全排列算法C语言实现_第4页
补充全排列算法C语言实现_第5页
资源描述:

《补充全排列算法C语言实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、字符串全排列算法C语言实现问题描述:输入一个字符串,打印出该字符串中字符的所有排列。输入:123输出:123132213231312321问题分析:现象分析:这种问题,从直观感觉就是用递归方法来实现即:把复杂问题逐渐简单化,进而得出具体代码实现。(如何发现一个问题可以使用递归方式来解决?经分析可以发现:M个数的排列方法与N(N>M)个数的排列方法没有区别,处理方法与数据的个数没有关系。处理方法的一致性,就可以采用递归)。3个数(123)排列,第一位1不动,剩下两个数(23)的排列,只要相互颠倒一下,就可以出现关于1开头的所有排列123132把2换到第一位,保持不动,剩下的两个数(13)的排列

2、,只要相互颠倒一下,就可以出现关于2开头的所有排列213231同理,把3换到第一位,可得到312321扩展:把3个数的所有排列,前面加一个4,就可以得到关于4开头的所有的排列412341324213423143124321若把4与后续数据中的任意一个数据交换,通过完成对后续三个数的全排列,就可以得到相应的数开头的四数的排列。总结:对4个数的排列,可以转换成首位不动,完成对3个数的排列对3个数的排列,可以转换成首位不动,完成对2个数的排列对2个数的排列,可以转换成首位不动,完成对1个数的排列对于1个数,无排列,直接输出结果算法实现说明:对n个数的排列,分成两步:(1)首位不动,完成对n-1个数

3、的排列,(2)循环将后续其他数换到首位,再次进行n-1个数的排列注:排列完成后,最终的串要与原串相同C语言代码实现:#include#include//将串左移一位,首位存到末尾。voidshift(char*s){if(!s

4、

5、!s[0])return;//securitycode.nullstringcharch=s[0];inti=0;while(s[++i])s[i-1]=s[i];s[i-1]=ch;}//本函数对于一个已排序好的数据进行全排列voidpermutation(charlist[],inthead){inti,len;len=st

6、rlen(list);if(len-head==1)//后续没有再排列的,则输出排列数据{printf("%s",list);}else{for(i=k;i

7、复数据出现在待排列的数据中,则,若某数已经当过队首,则与其相同的数再当队首是一样的排列结果,如:1233进行全排列当第一个3当队首时,会出现一次全排列第二个3当队首时,会出现与第一个3当队首相同的全排列,因此,只需要保证此数据出现过队首时,不要让其再当队首就可以解决问题了。代码实现://检查chk位的数据是否曾经当过队首/*list:待排列的全部数据chk:待检查的位置begin:已当过队首的数据的起始位置。因为是移位,所以,从begin检查到list尾就可以了。*/is_dup(char*list,intbegin,intchk){inti;for(i=begin;list[i];i++)

8、if(list[chk]==list[i])return1;return0;}voidpermutation(charlist[],intk){inti,len;len=strlen(list);if(len-k==1)//后续没有再排列的,则输出排列数据{printf("%s",list);}else{for(i=k;i

9、(char*a,char*b){charm;m=*a;*a=*b;*b=m;}//检查某数据是否曾经当过队首(在已交换过的数据中进行查找)/*list:待排列的全部数据end:当前交换的位置begin:待交换的位置*/intis_dup(char*s,intend,intbegin){inti=0;for(i=end;i>begin;i--)if(s[end]==s[i-1])return1;return0;

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。