全排列—递归实现

全排列定义

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

简单来说就是把n个不同数的所有排列情况罗列出来
如对1,2,3进行全排列:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
总共有f(n)=n!中排列情况,前提是n个不同的数!

全排列递归实现代码如下

注:下面的代码在原有基础上添加了去重的功能,即当n个数中有相同的数时,也能实现全排列,且没有重复的排列方式

#include <iostream>
using namespace std;
static int count = 0;                   //定义静态全局变量
int main()
{
    int a[] = {1,2,3};                  //定义数组
    Perm(a, sizeof(a)/sizeof(a[0]), 0); //递归函数
    return 0;
}
//N是考虑数组中需要变化的后几位数,即就是前(size-N)位不变,对后N位进行排列
//N为3表示数组不需要变化,直接打印即可,只有一种排列方法
//N为0表示三位数均要排列
void Perm(int* a, int size, int N)
{
    if(size==N)
    {
        for(int i=0; i<size; ++i)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
        count++;
        cout<<"count = "<<count<<endl;
    }
    else
    {
        for(int i=N; i<size; i++)      //使前面不变,后n-i个元素进行排序
        {
            if(IsSwap(a, N, i))        //判断如果出现重复的就不进行排序
            {
                swap(a[i], a[N]);
                Perm(a, size, N+1);
                swap(a[i], a[N]);      //每次让相邻的两个元素交换位置
            }
        }
    }
}
bool IsSwap(int *a, int start, int end)//判断该排列方式是否出现过(去重)
{  
    for (int i = start; i < end; i++)  
        if (a[i] == a[end])  
            return false;  
    return true;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值