博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全排列算法原理和实现
阅读量:6292 次
发布时间:2019-06-22

本文共 1058 字,大约阅读时间需要 3 分钟。

排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为

例说明如何编写全排列的递归算法。 1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。 由于一个数的全排列就是其本身,从而得到以上结果。 2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。 即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合. 从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。 因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。 为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。 算法如下:
#include 
<
stdio.h
>
  
int
 n 
=
 
0
;  
void
 swap(
int
 
*
a, 
int
 
*
b) 
{     
    
int
 m;     
    m 
=
 
*
a;     
    
*
=
 
*
b;     
    
*
=
 m; 
}  
void
 perm(
int
 list[], 
int
 k, 
int
 m) 
{     
    
int
 i;     
    
if
(k 
>
 m)     
    {          
        
for
(i 
=
 
0
; i 
<=
 m; i
++
)             
            printf(
"
%d 
"
, list[i]);         
        printf(
"
\n
"
);         
        n
++
;     
    }     
    
else
     
    {         
        
for
(i 
=
 k; i 
<=
 m; i
++
)         
        {             
            swap(
&
list[k], 
&
list[i]);             
            perm(list, k 
+
 
1
, m);             
            swap(
&
list[k], 
&
list[i]);         
        }     
    } 
int
 main() 
{     
    
int
 list[] 
=
 {
1
2
3
4
5
};     
    perm(list, 
0
4
);     
    printf(
"
total:%d\n
"
, n);     
    
return
 
0
}  

谁有更高效的递归和非递归算法,请回贴。
 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215388,如需转载请自行联系原作者
你可能感兴趣的文章
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>