本文将编写一个函数实现数学排列的功能,采用的办法是递归。具体功能如图所示:

一、函数的讲解

1.1 函数的原型
函数的原型:int** Permutation(int* iarr,int size);
将数组的首地址和数组的大小传递进去,函数将返回一个二维数组的地址,这个二维数组包含n!个一维数组(n即是size),而每一个一维数组又包含size个元素,二维数组的大小为n! * n

1.2 递归的大概思路(如图所示)
假设要数组的大小(size)为4,则要返回一个4!* 4大小的二维指针。

二-0 伪代码

伪代码#01:全排列,递归法。

输入:A[1...n]
输出:AA ;  n! x n 的二维数组
Permuate(A)size = A.lengthsp = size!dsp = sp / sizelet AA be new 2D Array(sp x size)if size == 1put A[0] to AAreturn AAfor i=1 to nlet A0 be new Arrayfill A0 with A, exclude A[i]AA0 = Permuate(A0)for j=dsp*(i-1) to dsp*i-1 ,j0=0 to dsp-1AA[j][0] = A[i]for k = 1 to size-1AA[j][k] = AA0[j0][k-1]return AA

二、伪代码的具体实现和main测试

#include <stdio.h>
#include <stdlib.h>#define pint(t) printf("The t is:%d\n",t);int** Permutation(int* iarr,int size)
{int amount=1;for(int i=2;i<=size;i++)amount*=i;int deamount=amount/size;int** garr;int** ptmp=NULL;int* tarr;//现malloc二维指针,再为每个二维指针指向的一维指针mallocgarr=(int**)malloc(amount*sizeof(int*));for(int i=0;i<amount;i++){(garr[i])=(int*)malloc(size*sizeof(int));}//size==1直接赋值并返回if(size==1){garr[0][0]=iarr[0];return garr;}tarr=(int*)malloc((size-1)*sizeof(int));for(int i=0;i<size;i++){//每次都令deamount个一维数组的第一个值设置为iarr[i]for(int j=0;j<deamount;j++){garr[deamount*i+j][0]=iarr[i];}//生成size-1大小的一维数组给下一层函数用int k=0;for(int j=0;j<size;j++){if(j!=i){tarr[k]=iarr[j];k++;}}//size-1数组的排列二维指针返回ptmp=Permutation(tarr,size-1);//为deamount个没有赋完值的数组赋值,每个数组都是从1 to size-1,而不是0 to size-1for(int z=0;z<deamount;z++){for(int j=0;j<(size-1);j++){garr[z+i*deamount][j+1]=ptmp[z][j];}}//释放接下来不用的地址for(int i=0;i<deamount;i++){free(ptmp[i]);}free(ptmp);}free(tarr);return garr;
}int main(void)
{#define len 8int arr[len]={6,2,3,4,1,8,9,7};int** grr=NULL;grr=Permutation(arr,len);pint(len);int amount=1;for(int i=2;i<=len;i++)amount*=i;for(int i=0;i<amount;i++){printf("%5d: ",i+1);for(int j=0;j<len;j++){printf("%d ",grr[i][j]);}printf("\n");}return 0;
}

三、运行结果与缺点

结果如图所示:8!=8x7x6x5x4x3x2x1=40320
生成了4万多行,主要运行时间用在在打印上了。
缺点是当size增大时,占用内存如指数增长。实际上把排列的情况都记录下来不实际也没意义。

时间:2020-08-20

End(最终补充)

 补充时间:2022-2-28

上面的算法做了很多不必要的重复,时间复制度很高。
其这个文件是LeetCode上的一道题目:46. 全排列(中等)
更好的办法是用DFS(深度优先遍历)算法解决,在线书籍有很好地讲解:https://labuladong.gitee.io/algo/1/5/

C语言-实现数学排列组合里的排列算法相关推荐

  1. java 数组的排列组合_java数组排列组合问题汇总

    面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列: 2. 有重复元素的数组,求全排列: 3. 无重复元素的数组,求组合[子集]: 4 ...

  2. 围成一圈的排列组合问题_行测技巧:排列组合之“环形排列”问题

    原标题:行测技巧:排列组合之"环形排列"问题 在公考学习备考中排列组合一直是大家比较头疼的题目,很多同学在高中时就对这种题目望而却步,其实排列组合题目虽然比较难,但是这类题目却可以 ...

  3. c语言中叹号 几个字节,排列组合里的惊叹号和A和C、P等符号都是什 – 手机爱问...

    2007-01-24 排列组合排列组合应如何学习 排列组合 热★★★ [字体:小 大] 排列组合 作者:佚名文章来源:本站原创点击数:更新时间:2004-3-19 [重点和难点分析] 一.排列组合部分 ...

  4. mysql排列组合实现_排列-组合的代码实现

    排列组合是算法常用的基本工具,如何在c语言中实现排列组合呢?思路如下: 首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消耗大量的栈空间,如果线程栈空间不够,那么就运行不下去了, ...

  5. python 排列组合_python 编写排列组合

    python在编写排列组合是会用到 itertools 模块 排列 import itertools mylist= list(itertools.permutations(['A','B','C', ...

  6. 排列组合 离散数学_排列组| 离散数学

    排列组合 离散数学 排列组 (Permutation Group) Let, X be a non-empty set. A permutation of X is a one-one functio ...

  7. 排列组合问题的通用算法

    尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手.由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论.以在n ...

  8. 解决排列组合问题的通用算法

    很多网友发贴询问诸如:八皇后问题.彩票问题(从m中数中选择n(m>=n)的组合)等,其实这都可归结为排列组合的问题.解决这类问题,用for循环嵌套是不现实的(只能对指定的m.n编程,而且程序看上 ...

  9. EXCEL 把几列排列组合列出所有排列组合情况的绿色工具

    对于如下问题: EXCEL 利用排列组合公式列出所有排列组合情况 在excel中如何实现第一列和第二列排列组合,输出到第三列 使用这个工具:http://www.excelfb.com/ 点击: 排列 ...

最新文章

  1. 波士顿动力机器狗要去切尔诺贝利上班了
  2. 团队冲刺站立会议03
  3. c++模板--2(模板机制,模板的局限性,类模板,类模板做函数的参数)
  4. 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式
  5. c++ vector常用用法总结
  6. matlab画图 横坐标为年月
  7. 手机开热点但是电脑一直连接不上_电脑连接手机热点无法上网的三种解决方法...
  8. 行业如此内卷,品牌如何实现可持续招商增长?
  9. SVN Working copying #39;xxxxx/xxxx/xxxx#39; locked
  10. 如何把数字金额转换成中文大写
  11. 五个温度带的分界线_初中地理知识点:我国的温度带
  12. js_window.open新标签页,当前标签页打开
  13. CentOS7没有图形化界面,怎么安装图形化界面
  14. 使用C++_GDAL剪切大型tif图
  15. SQL Server2008无法连接到XX,在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
  16. python3 题解(12)字母金字塔
  17. Android-UI-绘制请求与绘制时机
  18. 字符串转换成整数-----字符串‘123456’转换成数值123456(指针)
  19. 处理器,操作系统,编译器,调试器,语言和工具,网络
  20. 飞凌嵌入式 全志A40i开发板试用体验 之 模块初体验

热门文章

  1. 我和计算机比本领教案反思,《比本领》教案设计及反思
  2. HashTable详解(图文有代码)
  3. 把员工外包给人事外包公司应该怎么协调好员工
  4. 华为最新“天才少年”宁博宇曝光,将关注这个科技领域!
  5. Android判断当前Android版本号
  6. 服务器目标文件夹访问被拒绝,win10系统访问文件夹被拒绝怎么办_网站服务器运行维护...
  7. CPU接触不良故障排除
  8. 在Mac上制作树莓派SD镜像
  9. 融合会计服务与金融服务,银账通造福千万小微企业!
  10. iMeta | 2022年iMeta进展与审稿人致谢