排列与组合的C语言实现

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

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

 

经过数学公式咱们知道,spa

 

先来看排列的实现,假如集合为{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,选择结束,请看下图:3d

 

 

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

ABCblog

ABD排序

ACD递归

BCDget

状况与排列的相似,但有一点不一样的是,假设第一个数选了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,选择结束。

 

【查看完整代码实现】

相关文章
相关标签/搜索