C语言实现全排列 |
您所在的位置:网站首页 › 排序问题c语言 › C语言实现全排列 |
全排列的定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列 全排列的递归可以尝试自己画一下特别有帮助对研究递归嵌套,反正就是特别难 在书上说:设R={r1,r2,....,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。 R的全排列可归纳定义如下: 在N=1时,Perm(R)=(r),其中r是集合R中唯一的元素; 当N>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2)等构成 依次递归定义,可设计产生Perm(R)的递归算法 void permutation(int k, int n, int a[]) { //递归到底层 if(k == n-1) { for(int i = 0; i < n; i ++) printf("%d-", a[i]); printf("\n"); } else { for(int i = k; i < n; i ++) { int temp = a[k]; a[k] = a[i]; a[i] = temp; //交换后递归下一层 permutation(k+1, n, a); //保证每一层递归后保持上一层的顺序 temp = a[k]; a[k] = a[i]; a[i] = temp; } } } 源码为 #include void permutation(int k, int n, int a[]) { //递归到底层 if(k == n-1) { for(int i = 0; i < n; i ++) printf("%d-", a[i]); printf("\n"); } else { for(int i = k; i < n; i ++) { int temp = a[k]; a[k] = a[i]; a[i] = temp; //交换后递归下一层 permutation(k+1, n, a); //保证每一层递归后保持上一层的顺序 temp = a[k]; a[k] = a[i]; a[i] = temp; } } } int main() { int a[100]; int n,k; printf("取n个不同的元素,n为:"); scanf_s("%d", &n); printf("元素为(元素不能重复):"); for(int i = 0; i < n; i ++) { scanf_s("%d",&k); a[i] = k; } permutation(0, n, a); int ll; scanf_s("%d",&ll); return 0; } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |