主题: (1)一组数字的全排列;(2)求一组数字中几个数字的组合
一.数组算法:
所有数组是将一组数按照一定的顺序排列而成的,如果一组数有n个,则所有数组数为n! 个。 本节以{ 1,2,3 }为例,说明如何创建所有数组的递归算法。 如下图所示。
在上图中,第一层S1表示第一个数分别与第一、二、三个数交换的位置。 例如,123与第一个数1交换,213与第一个数2交换,321与第三个数交换。 第二层S2是第二个数分别与第二、第三个数交换位置. 最后一层所有叶的节点是全数组的所有结果。 第k层的节点Sk是母节点的第k个个数,分别与第k、k 1.n个个数交换位置。
递归算法代码:
代码#include stdio.h
int n=0;
语音快照(int *b,int *b ) )。
{
int m;
m=*a;
*a=*b;
*b=m;
}
voidperm(intlist[],int k,int m ) )。
{
int i;
If (千米) )。
{
for(I=0; i=m; I )
printf(‘%d ‘,list[i] );
printf((n );
n;
}
else
{
for(I=k; i=m; I )
{
swap(list[k],list[i];
perm(list,k 1,m );
swap(list[k],list[i];
}
}
}
int main () )
{
intlist [ ]={ 1,2,3,4,5 };
perm (列表,0,4 );
printf (总3360 % d (n ),n );
返回0;
}
二、组合算法:
组合是指从n个中选择m个的所有组合。 (n=m ) )。
运用递归思想,假设n=4,m=2,数组a { 1,2,3,4 },算法思想如下图所示。
在上图中,第1层中的S1节点是数组中的所有数字,第二个S2节点分别从父节点的下一个位置开始。 在这个例子中,m=2,所以一共是2楼。 从一楼到二楼,深入遍历这棵树,就会得到所有的组合。
递归算法代码:
代码#include vector
#include iostream
用户命名空间STD;
voidcomb(intindex、int begin、int len、int n、int *A、int *C );
int main () )
{
inta [5]={ 1,2,3,4,5 };
int len=5,n=3;
int *C=new int[n 1];
comb (0,0,len,n,a,c );
delete []C;
返回0;
}
//递归组合
voidcomb(intindex、int begin、int len、int n、int *A、int *C ) ) ) ) ) ) ) ) ) )。
{ //index表示某个组合中的索引,begin表示从数组a中的begin的位置开始查找,
//len表示阵列a长度,n表示组合中的个数,a表示原始阵列,c表示组合阵列
if(index==n ) )。
{
for(intI=0; in; I )
coutC[i] ‘;
coutendl;
返回;
}
for(intj=Begin; j=len-n index; j )
{
C[index]=A[j];
comb (索引1,j 1,len,n,a,c );
}
}
转载于:https://www.cnblogs.com/仁爱汽车1988 happy/archive/2011/12/13/2285819.html