首页 > 编程语言 > 详细

排列与组合的C语言实现

时间:2014-03-03 15:46:21      阅读:481      评论:0      收藏:0      [点我收藏+]

排列与组合是数学里的经典问题,由这个问题可引申出子集、字典排序等问题,那么,我们先看经典的排列与组合,怎么在程序里实现。

在网上搜了一下,关注这个问题的人还是挺多的,有不了人给出的回答是使用几个for循环进行嵌套,例如取3个数的排列则使用3for循环i,j,k嵌套,当i,j,k互不相等时进行输出,这样的函数虽然是正确的,但是没有通用性,我们要实现的是从m中取nmn皆为变量。

 

通过数学公式我们知道,

bubuko.com,布布扣

 

先来看排列的实现,假如集合为{ABC},取出2个的排列为AB AC BA BC CA CB,从这里我们不难看出,第一个字母可从{ABC}中任取一个,假如选了A,第二字母从剩下的集合中{BC}再任选一个,这样便完成了排列,规则其实很简单,取n个数,从第一个数开始选,选完之后从集合中去掉这个数,开始选第2个数,一直到取第n个数为止。

 

程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已排集合及未排的集合,每次挑选第i个数时,arr[0]arr[i-1]为已排集合,未排集合为arr[i]arr[m-1],这里从未排集合中依次取出一个元素,交到当前arr[i]的位置,此时未排集合变为arr[i+1]arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束,请看下图:

 

 bubuko.com,布布扣

下面来看组合数的情况,设集合为{ABCD},选则3个数进行组合,组合情况为:

ABC

ABD

ACD

BCD

情况与排列的类似,但有一点不同的是,假设第一个数选了A,则剩下的集合为{BCD},这样便输出了所有包含A的组合情况;这时,当第一个数选了B时,则剩下的集合为{CD},而不是{ACD},因为所有包含A的组合已经输出了,即A已经从当前集合中排除了。

 

程序里我们这样设计,对一个数组里的元素进行排列,我们可将数组分为两部分,已选择的集合及未排的集合,每次挑选第i个数时,arr[0]arr[i-1]为已排元素,未排集合为arr[j]arr[m-1],这里未排集合中依次取出一个元素,假设为arr[k],其中k[j,m-1]之间,交换到当前arr[i]的位置,此时未排集合为arr[k+1]arr[m-1],并开始递归选择i+1个数,直到i=n,选择结束。

 

【查看完整代码实现】

排列与组合的C语言实现,布布扣,bubuko.com

排列与组合的C语言实现

原文:http://www.cnblogs.com/chaofeng/p/3576963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!