排列的定义:
从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。
C实现全排列代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| //全排列 void permutation(int *array,int start,int end){ int temp; int i=0; if(start>end) return; if(start<end){ permutation(array, start+1, end); for(i=start+1;i<=end;i++){ temp=array[start]; array[start]=array[i]; array[i]=temp; permutation(array, start+1, end); temp=array[start]; array[start]=array[i]; array[i]=temp; } }else{ for(i=0;i<=end;i++){ printf("%d ",array[i]); } printf("\n"); } }
|
测试用例如下:
1 2 3 4 5
| int main(void){ int i[5]={1,3,4,2,5}; permutation(i,0,4); return 0; }
|
运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| 1 3 4 2 5 1 3 4 5 2 1 3 2 4 5 1 3 2 5 4 1 3 5 2 4 1 3 5 4 2 1 4 3 2 5 1 4 3 5 2 1 4 2 3 5 1 4 2 5 3 1 4 5 2 3 1 4 5 3 2 1 2 4 3 5 1 2 4 5 3 1 2 3 4 5 1 2 3 5 4 1 2 5 3 4 1 2 5 4 3 1 5 4 2 3 1 5 4 3 2 1 5 2 4 3 1 5 2 3 4 1 5 3 2 4 1 5 3 4 2 3 1 4 2 5 3 1 4 5 2 3 1 2 4 5 3 1 2 5 4 3 1 5 2 4 3 1 5 4 2 3 4 1 2 5 3 4 1 5 2 3 4 2 1 5 3 4 2 5 1 3 4 5 2 1 3 4 5 1 2 3 2 4 1 5 3 2 4 5 1 3 2 1 4 5 3 2 1 5 4 3 2 5 1 4 3 2 5 4 1 3 5 4 2 1 3 5 4 1 2 3 5 2 4 1 3 5 2 1 4 3 5 1 2 4 3 5 1 4 2 4 3 1 2 5 4 3 1 5 2 4 3 2 1 5 4 3 2 5 1 4 3 5 2 1 4 3 5 1 2 4 1 3 2 5 4 1 3 5 2 4 1 2 3 5 4 1 2 5 3 4 1 5 2 3 4 1 5 3 2 4 2 1 3 5 4 2 1 5 3 4 2 3 1 5 4 2 3 5 1 4 2 5 3 1 4 2 5 1 3 4 5 1 2 3 4 5 1 3 2 4 5 2 1 3 4 5 2 3 1 4 5 3 2 1 4 5 3 1 2 2 3 4 1 5 2 3 4 5 1 2 3 1 4 5 2 3 1 5 4 2 3 5 1 4 2 3 5 4 1 2 4 3 1 5 2 4 3 5 1 2 4 1 3 5 2 4 1 5 3 2 4 5 1 3 2 4 5 3 1 2 1 4 3 5 2 1 4 5 3 2 1 3 4 5 2 1 3 5 4 2 1 5 3 4 2 1 5 4 3 2 5 4 1 3 2 5 4 3 1 2 5 1 4 3 2 5 1 3 4 2 5 3 1 4 2 5 3 4 1 5 3 4 2 1 5 3 4 1 2 5 3 2 4 1 5 3 2 1 4 5 3 1 2 4 5 3 1 4 2 5 4 3 2 1 5 4 3 1 2 5 4 2 3 1 5 4 2 1 3 5 4 1 2 3 5 4 1 3 2 5 2 4 3 1 5 2 4 1 3 5 2 3 4 1 5 2 3 1 4 5 2 1 3 4 5 2 1 4 3 5 1 4 2 3 5 1 4 3 2 5 1 2 4 3 5 1 2 3 4 5 1 3 2 4 5 1 3 4 2
|
组合的定义:
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
C实现组合代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #define N 5 //组合,C(num,m) void combination(int *array,int start,int num,int m){ static int queue[N]; static int top; int i; if(start>num) return; if(top==m){ for(i=0;i<m;i++){ printf("%d ",queue[i]); } printf("\n"); return; } queue[top++] = array[start]; combination(array,start+1,num,m); top--; combination(array,start+1,num,m); }
|
测试用例如下:
1 2 3 4 5
| int main(void){ int i[N]={1,3,4,2,5}; combination(i,0,5,2); return 0; }
|
运行结果如下:
1 2 3 4 5 6 7 8 9 10
| 1 3 1 4 1 2 1 5 3 4 3 2 3 5 4 2 4 5 2 5
|
本文标题:C实现排列组合
文章作者:Mr Bluyee
发布时间:2018-07-23
最后更新:2019-07-15
原始链接:https://www.mrbluyee.com/2018/07/23/C%E5%AE%9E%E7%8E%B0%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/
版权声明:The author owns the copyright, please indicate the source reproduced.