算法01:全排列递归算法

来源:互联网 发布:战国无双真田丸pc优化 编辑:程序博客网 时间:2024/05/09 18:03

全排列字典序算法http://http://blog.csdn.net/u014599786/article/details/23260089

全排列是指n个元素按一定顺序的所有排列组合,如{1,2,3}三个元素的全排列为{1,2,3}、{1,3,2}、{2,1,3}、{2,3,1}、{3,1,2}、{3,2,1}共3!种。

常见排列的算法一般有:

(1)递归法

(2)字典序法

(3)邻位对换法

(4)递增进位制数法

(5)递减进位制数法

具体介绍:

(1)递归法

如求{1,2,3,4}的全排列

1.先考虑最后一个数{4}的全排列p(4)={{4}}一种;

2.{3,4}的全排列p(3,4)={{3,4},{4,3}}两种;

3.{2,3,4}的全排列p(2,3,4)=2p(3,4)+3p(2,4)+4p(2,3),依此类推。

算法思路:

1.首先定义一个数组和一个交换数组元素的函数

int list[] = {1,2,3,4} , n = 4;void swap(int *a, int *b){     int temp;         temp = *a;     *a = *b;     *b = temp;}
2.递归函数的基本思想是:

(1)求1p(2,3,4),即以1开头求出剩下的数{2,3,4}的全排列;

(2)为了求出2p(3,4)+3p(2,4)+4p(2,3),p(3,4)={{3,4},{4,3}},相当于把list数组最后两个元素交换,3p(2,4)又可以看成把3和2交换后求p(2,4),4p(2,3)是把4和3交换后求p(3,2);

(3)再求2p(1,3,4),相当于把2和1交换后求剩下数的全排列。

由此可得到递归函数,其中i为每次递归排列的第一个数的位置,k为要和第一个数交换的数的位置

void perm(int k){     int i;          if(k >= n){        for(i = 0; i < n; i++)            cout<<list[i];                    cout<<endl;        total++;     }else{        for(i = k; i < n; i++){            swap(&list[k], &list[i]);                         perm(k+1);                        swap(&list[k], &list[i]);         }        }}

完整算法:

#include <cstdlib>#include <iostream>using namespace std;int list[100], n,total;void swap(int *a, int *b){     int temp;         temp = *a;     *a = *b;     *b = temp;}void perm(int k){     int i;          if(k >= n){        for(i = 0; i < n; i++)            cout<<list[i];                    cout<<endl;        total++;     }else{        for(i = k; i < n; i++){            swap(&list[k], &list[i]);                         perm(k+1);                        swap(&list[k], &list[i]);         }        }}int main(){       while(cin>>n){                        for(int i = 0; i < n;)             list[i] = ++i;         total = 0;                perm(0);         cout<<total<<endl;    }        system("PAUSE");    return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小丑鱼老在缸上边游不下去怎么办 海缸养珊瑚又想养蝴蝶鱼怎么办 被几个月的小狗咬了怎么办 木本植物继代长出大量愈伤怎么办 钱兜树叶子发黄掉叶怎么办 手机qq群200人满了怎么办 支票被背书人的章盖浅了怎么办 没病装病的心理病患者怎么办 20多岁被骗40多万怎么办 一个学生上课爱捣乱班级课堂怎么办 军训的时候大姨妈来了怎么办 笔记本连接无线网说链接限制怎么办 12306密码和邮箱都忘了怎么办 烦恼都是自找的新书散页了怎么办 白色衣服被红色衣服染了怎么办 手机微信里面不能拍手功怎么办 肇事逃逸轻伤且对方不私了怎么办 数学差怎么办脑子不好啊数学学不老 手机号丢失微信密码丢失怎么办找回 悦借钱输入五次密码被锁怎么办 生源地助学贷款密码忘了怎么办 生源地助学贷款登录密码忘了怎么办 助学贷款支付宝密码忘了怎么办 微信密码忘记了手机号也换了怎么办 换手机号了微信密码忘记了怎么办 qq密码忘记了手机号也换了怎么办 一年只能修改一次昵称我能怎么办 华为手机的账号和密码丢失怎么办 华为手机的账号和密码丢失了怎么办 手机号被别人注册了微博怎么办 微博账号一天内多次解冻怎么办 露娜注册时邮箱填错了怎么办 苹果4s手机显示已停用怎么办 新买的微博小号太多内容了怎么办 向海关申报价格低于实际价格怎么办 百度云下载内容包含违规信息怎么办 跨境汇款错了不能退款怎么办 公司欠钱没有还被起诉了。怎么办 战网的姓名不是身份证名字怎么办 手机号码被别人注册了微信怎么办 手机号码被别人注册过微信怎么办