前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全排列(permutation)

全排列(permutation)

作者头像
lexingsen
发布2022-02-24 16:01:48
5020
发布2022-02-24 16:01:48
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

显然,对于具有n个元素的集合R,R={r1,r2,r3…rn},其排列方式有n!种。 如:R = {1,2,3},其全排列如下: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1

这里写图片描述
这里写图片描述

从上边的排列中可以看出规律,以集合中某一元素作为第一个数字,集合当中的其余数字做全排列。而其余数字组成的集合可以看作是子集合,子集合中的第一个元素作为第一个数字,子集合当中的其余数字做全排列。可以看出,这是一个递归过程。有了上面的思想,可以容易的写出一个递归算法解决全排列的问题。 代码实现:

代码语言:javascript
复制
#include<cstdio>
//交换数组的i项和j项
void swap(int A[],int i,int j){
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}

void show(int A[],int n){
    for(int i=0;i < n;++i){
        printf("%d ",A[i]);
    }
    printf("\n");
}
//对数组做排列,p,q之间做全排列
void permutation(int A[],int p,int q){
    //递归出口,只有一个元素时。全排列就是其本身
    if(p == q){
        show(A,q+1);//数组是从0下标开始的
    }
    for(int i=p;i <= q;++i){
        swap(A,p,i);
        perm(A,p+1,q);//子集合做全排列
        swap(A,p,i);//恢复,否则会有重复
    }
}

test1.c

代码语言:javascript
复制
int main(){
    int arr[] = {1,2,3};
    permutation(arr,0,2);
    return 0;
}
这里写图片描述
这里写图片描述

test2.c

这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档