算法分析

 设有一字母数组为:

word = {‘a’,‘b’,‘c’,‘d’…}
假设word当前只有四个与元素,分别为a、b、c、d;

 如果需要将word数组按照全排列打印的话,则所有的结果有4 * 3 * 2 *1 = 24种排列顺序,分别为:

abcd、abdc、acbd、acdb、adcb、adbc
bacd、badc、bcad、bcda、bdca、bdac
cbad、cbda、cabd、cadb、cdab、cdba
dbca、dbac、dcba、dcab、dacb、dabc

 观察排列结果可知

a后面是bcd的全排列
b后面是cd的全排列
……

 即可以将题目分解几个不同规模的问题,原理如下图所示:
      图片来源

 即需要得到以a为开头的所有字母顺序时,求bcd的所有排列顺序即可,以此类推

核心代码分析
for(i = start;i <= end;i++){     //for循环为核心代码SWAP(list[start],list[i],temp);  //交换list[start]和list[i]的值perm(list,start + 1,end);        //进行递归,start+1表示求剩下字母的所有排列顺序SWAP(list[start],list[i],temp);  //还原字母顺序
}

 函数SWAP(x,y,t)为宏定义,用于交换x和y的值。
 核心代码中含有两个SWAP(x,y,z),且分别在递归调用前和递归调用后。

第一个SWAP(x,y,z)

就拿递归中第一层来说,因为执行到该语句时,已经完成以x为开头的所有字母序列的打印,所以需要置换新的字母作字母序列的首字母。相应得,x就需要参与首字母后面的几个字母的排列。
例如完成已经打印所有以a为首字母的序列时

abcd、abdc、acbd、acdb、adcb、adbc

就需要将a和b置换过来,使得a和c、d按照不同顺序排成字母序列连接在b后面,生成以b为首字母的所有字母序列

bacd、badc、bcad、bcda、bdca、bdac

第二个SWAP(x,y,z)

简单来说就是还原字母顺序,使得第一个SWAP(x,y,z)每次置换的结果是使得全排列结果的所有字母序列的首字母是按照原数组中字母顺序排列的。
例如原数组中字母顺序为:a、b、c、d
那么全排列的结果顺序应该为:

abcd、abdc、acbd、acdb、adcb、adbc
bacd、badc、bcad、bcda、bdca、bdac
cbad、cbda、cabd、cadb、cdab、cdba
dbca、dbac、dcba、dcab、dacb、dabc

C++代码
/*将字母按照全排列顺序打印*/
#include <iostream>
#define SWAP(x,y,t)((t) = (x),(x) = (y),(y) = (t))    //用于交换两个变量的值using namespace std;
void perm(char list[],int start,int end){int i;char temp;if(start == end){for(i = 0;i <= end;i++)cout<<list[i];cout<<endl;}else{for(i = start;i <= end;i++){     //for循环为核心代码SWAP(list[start],list[i],temp);  //以已作为首字母出现的字母移动到后面perm(list,start + 1,end);SWAP(list[start],list[i],temp);  //还原字母顺序}}
}int main(){char list[4] = {'a','b','c','d'};perm(list,0,3);return 0;
}

参考书籍:《数据结构基础》(C语言版)

字母全排列——递归方法相关推荐

  1. 字母全排列快速算法C代码

    全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA. //原理是插入, 在一个字符串的所有位置插入新字符. //如: A ...

  2. 超级青蛙、汉诺塔、汉诺塔Ⅱ、kimi的早餐店、字母全排列

    题目描述 一只超级青蛙一次可以跳上1级台阶,也可以跳上2级--它也能够跳上n级台阶.请问,该青蛙跳上一个n级的台阶总共有多少种跳法? 输入 输入一个正整数n表示台阶的数量. 输出 输出总的跳法数. 样 ...

  3. 求不同字母全排列两种递归模板

    // ABCDE 所有排列 public class B { // aa: 待排数据// k: 考虑的当前位置(数组下标)static void f(char[] aa, int k){if(k==a ...

  4. python打印字符串全排列_【算法15】字符串的全排列

    [题 目]输入一个字符串,打印该字符串的所有排列.例如输入字符串abc,输出其全排列为abc,acb,bac,bca,cab,cba. [思 路]我们想一下,如果不编程,手工做的话,我们的基本考虑是: ...

  5. Java实现的全排列和排列

    关于全排列和排列的问题已经困扰我n久了,虽然在组合数学中很简单,但是要想编程来实现还真不那么简单.排列组合的方法在做算法题的时候经常能够遇到,主要是对结果的所有可能进行穷举,穷举的方法一般都离不开排列 ...

  6. 全排列算法—java详细实例

    全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 公式: 不含重复元素: 全排列数f(n)=n! ...

  7. 269道各路算法考试题集锦

    1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...

  8. java递归实现数组逆序_Java实现数组全排序(递归)

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下:(从后往 ...

  9. 排列和组合简单的递归思路以及C++实现

    本文将讲解如何通过递归的方法实现全排列和组合,会详细讲解递归的思路,最后还会给出c++实现的源码.先前学习数据结构和算法的时候一直没有弄明白它们的递归思路,今日遇到,细一思考,发现并没有之前那么难,于 ...

最新文章

  1. 埃洛等级分系统【转自百度百科】
  2. phpwind 8.7 发布主题 分析
  3. 如何为libs目录下的jar包关联源代码
  4. linux之找出两个文件里面相同的数据
  5. 手机画面尺寸多少满屏_各种大屏手机之中适合用户的最佳尺寸是多少?
  6. 蔚来Q3营收近百亿、毛利率20.3%,预计明年下半年推出2款新车
  7. php网站 只显示sinsiu_sinsiu_cms_1_0_10
  8. eclipse自动补全设置
  9. 【安卓8】文件的读写
  10. 交通仿真软件测试自学,交通仿真及常用的仿真软件简介
  11. CAD常用字体库大全
  12. 关闭笔记本电脑计算机键盘,笔记本电脑关闭键盘_笔记本电脑怎么关键盘
  13. 波束形成matlab程序,mVDR波束形成matlab程序
  14. python在电力系统中的应用_SKIDL: 在PYTHON中描述你的电路
  15. .NET破解之太乐地图下载器【非暴破】
  16. java jit_Java的JIT
  17. Selenium使用浏览器自动登录校园网
  18. AndroidStudio写的个人信息修改界面
  19. Python量化交易|pd.expanding() VS pd.rolling() 时间窗口函数区别图解
  20. 第一、二、三代半导体的发展

热门文章

  1. i2c 驱动五:gpio模拟i2c
  2. 快速生成不重复的卡号
  3. 无线局域网中iPhone无法访问IIS
  4. azure mysql数据库_Azure上创建MySql数据库服务
  5. 基于go语言搭建高性能IM系统
  6. Windows下cmd命令无法切换盘符
  7. Android开发之那些好用的数据结构与API(二)
  8. 海南信用社计算机试题,2021年海南农村信用社计算机笔试内容17
  9. 我的无线宽带由器 TP-LINK TL-WR841N如何设置限
  10. AI - H2O - 安装与运行