求集合全排列算法(递归)

标签: 数据结构 算法 递归 集合 全排列
5人阅读 评论(0) 收藏 举报
分类:

问题描述

给定一个集合(a1,a2,a3,…,an),求该集合的所有排列。如集合(1,2,3)的所有排列为(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。

思路

可以发现,得到集合全排列的思想为求a1+(a2,a3,…,an)的全排列,而a1可以与集合中的n个元素进行交换,同理,(a2,a3,…,an)的全排列等于a2+(a3,a4,…,an)的全排列,以此类推,可以写出递归算法

代码

#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 1000;

void swap(int &a, int &b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void permutation(int a[], int k, int m) { // m为集合长度
    if(k == m) { // 递归到底层
        for(int i = 0; i <= m; i++)
            cout << a[i];
        cout << endl;
    }
    else {
        for(int i = k; i <= m; i++) 
            swap(a[k], a[i]); // 固定一个数
            permutation(a, k+1, m); // 求剩余数的全排列
            swap(a[k], a[i]); // 完成递归之后交换回来
        }
    }
}

int main() {
    int n, a[maxn];
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    permutation(a, 0, n-1);
    return 0;
}

输出

这里写图片描述

查看评论

使用递归求出一个集合的所有子集

想一下,平时如果给你1,2,3,4四个数,让你写出它的所有子集,你会怎么做? 我想大部分人的思路是先写出子集中只含有一个元素的子集:1;2;3;4。然后考虑子集中含有两个元素的子集:1,2;1,3;...
  • nkuhjp
  • nkuhjp
  • 2016-09-21 21:05:46
  • 4388

递归求集合的所有子集的程序

#include #include using namespace std; //算法描述: //1、如果遍历完全集,打印出所有被标记为true的元素 //2、否则: //3、取第de...
  • woaifen3344
  • woaifen3344
  • 2012-04-25 13:01:48
  • 3491

笔试面试算法经典--全排列算法-递归&字典序实现(Java)

全排列算法-递归&字典序实现全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 例如: 1 、...
  • u013309870
  • u013309870
  • 2017-04-01 09:48:42
  • 4545

编程实现全排列

#include void swap(int *a,int *b) {    int m;    m=*a;    *a=*b;    *b=m; } void fun(int a[]...
  • zyq_19960204
  • zyq_19960204
  • 2015-08-14 21:24:39
  • 138

算法----递归求子集

#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; char s[50]; int index = 0;//标记选...
  • RUN32875094
  • RUN32875094
  • 2018-02-18 15:47:17
  • 75

每日一省之———— 递归 + 回溯 求集合的幂集

import java.util.ArrayList; import java.util.List;/** * 所谓幂集(Power Set), 就是一个集合中所有的子集(包括全集和空集)作为元素构...
  • nmgrd
  • nmgrd
  • 2017-02-22 00:44:06
  • 1290

递归求全排列算法

  • 2012年08月13日 11:19
  • 41KB
  • 下载

全排列的实现方法--递归&字典序

一:背景 全排列在很多笔试都有应用,是一个很常见的算法,关于这类的题目变化很多。这种算法的得到基于以下的分析思路。  给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。 ...
  • LaoJiu_
  • LaoJiu_
  • 2016-04-11 15:33:25
  • 6881

求集合的所有子集问题

  • 2009年03月15日 18:16
  • 174KB
  • 下载

C语言递归求子集

C语言编程问题,要求使用递归,给定自然数1~n的集合,和自然数m,求各元素之和等于m的子集,设n=20,m= C语言给定自然数1~n的集合,和自然数m,求各元素之和等于m的子集,设n=20,m=48....
  • jaket5219999
  • jaket5219999
  • 2016-11-23 18:12:54
  • 1214
    个人资料
    持之以恒
    等级:
    访问量: 361
    积分: 84
    排名: 152万+
    文章存档
    最新评论