个人博客排列表示把集合中元素按照一定的顺序排列起来。
组合指从n个不同元素中取出m个元素来组成的一个组,这个组内元素没有顺序。
(1)排列问题:
{1, 2, 3}的全排列为:
123;132;
213;231;
312;321;
这是怎么写出来的呢?先看下面这幅图。
将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。
个人博客c语言代码如下:
void perm(int list[], int s, int e, void (*cbk)(int list[])) { int i; if(s > e) { (*cbk)(list); } else { for(i = s; i <= e; i++) { swap(list, s, i); perm(list, s + 1, e, cbk); swap(list, s, i); } } }
其中:
void swap(int * o, int i, int j) { int tmp = o[i]; o[i] = o[j]; o[j] = tmp; } void cbk_print(int * subs) { printf("{"); for(int i = 0; i < LEN; i++) { printf("%d", subs[i]); (i == LEN - 1) ? printf("") : printf(", "); } printf("}\n"); } (2)组合问题
从{1,2,3,4}中取出2个元素的组合为:
12;13;14; 23;24; 34 看下面这幅图:![]()
每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。
个人博客C语言代码如下:
void combine(int s[], int n, int k, void (*cbk)(int * subset, int k)) { if(k == 0) { cbk(subset, k); return; } for(int i = n; i >= k; i--) { subset[k-1] = s[i-1]; if(k > 1) { combine(s, i-1, k-1, cbk); } else { cbk(subset, subset_length); } } }nike官網 中山网站建设 荆州SEO 中山跆拳道 中山律师