补充全排列算法C语言实现.doc_第1页
补充全排列算法C语言实现.doc_第2页
补充全排列算法C语言实现.doc_第3页
补充全排列算法C语言实现.doc_第4页
补充全排列算法C语言实现.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

字符串全排列算法C语言实现问题描述:输入一个字符串,打印出该字符串中字符的所有排列。输入:123输出:123132213231312321问题分析:现象分析:这种问题,从直观感觉就是用递归方法来实现即:把复杂问题逐渐简单化,进而得出具体代码实现。(如何发现一个问题可以使用递归方式来解决? 经分析可以发现:M个数的排列方法与N(NM)个数的排列方法没有区别,处理方法与数据的个数没有关系。处理方法的一致性,就可以采用递归)。3个数(123)排列,第一位1不动,剩下两个数(23)的排列,只要相互颠倒一下,就可以出现关于1开头的所有排列 123 132把2换到第一位,保持不动,剩下的两个数(13)的排列,只要相互颠倒一下,就可以出现关于2开头的所有排列 213 231同理,把3换到第一位,可得到 312 321扩展:把3个数的所有排列,前面加一个4,就可以得到关于4开头的所有的排列412341324213423143124321若把4与后续数据中的任意一个数据交换,通过完成对后续三个数的全排列,就可以得到相应的数开头的四数的排列。总结:对4个数的排列,可以转换成首位不动,完成对3个数的排列对3个数的排列,可以转换成首位不动,完成对2个数的排列对2个数的排列,可以转换成首位不动,完成对1个数的排列对于1个数,无排列,直接输出结果算法实现说明:对n个数的排列,分成两步:(1)首位不动,完成对n-1个数的排列,(2)循环将后续其他数换到首位,再次进行n-1个数的排列注:排列完成后,最终的串要与原串相同C语言代码实现: #include #include /将串左移一位,首位存到末尾。void shift( char *s )if ( !s|!s0 ) return ; /security code . null stringchar ch=s0;int i=0;while( s+i )si-1=si ;si-1=ch;/本函数对于一个已排序好的数据进行全排列void permutation(char list, int head ) int i,len; len=strlen(list) ; if ( len-head = 1 ) /后续没有再排列的,则输出排列数据 printf( %sn, list ); else for (i = k; ilen; i+) /从当前位置开始,每个数当一次队首,并进行后续排列 permutation(list, head+1); /后续串排列shift( &listhead ); /轮流为当第一 void pailie( char *str ) permutation( str, 0 ); /排列算法,从串的第几位开始排列 int main() char str=1234; pailie(str); return 0;带重复数据的排列问题:如果有重复数据出现在待排列的数据中,则,若某数已经当过队首,则与其相同的数再当队首是一样的排列结果,如:1233进行全排列当第一个3当队首时,会出现一次全排列第二个3当队首时,会出现与第一个3当队首相同的全排列,因此,只需要保证此数据出现过队首时,不要让其再当队首就可以解决问题了。代码实现:/检查chk位的数据是否曾经当过队首/*list:待排列的全部数据 chk:待检查的位置 begin:已当过队首的数据的起始位置。因为是移位,所以,从begin检查到list尾就可以了。*/is_dup( char *list, int begin, int chk )int i;for( i=begin; listi; i+ )if ( listchk = listi )return 1;return 0;void permutation(char list, int k) int i,len; len=strlen(list) ; if ( len-k = 1 ) /后续没有再排列的,则输出排列数据 printf( %sn, list ); else for (i = k; ibegin;i- )if ( send = si-1 )return 1;return 0;void permutation(char list, int k) int i,len; len=strlen(list) ; if ( len-k = 1 ) /后续没有再排列的,则输出排列数据 printf( %sn, list ); else for (i = k; ilen; i+) if ( !is_dup ( list,i,k ) ) /如果没有重复的,则进行相应的排列,否则跳过之,因为:相同的数据当队首,交换没有意义swap(&listk, &listi);/交换permutation(list, k+1); /后续串排列swap(&listi, &listk);/恢复 void p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论