本文为原创,如需转载,请注明作者和出处,谢谢!

    全排列是将一组数按一定顺序进行排列,如果这组数有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;     
    *a = *b;     
    *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; 
}

谁有更高效的递归和非递归算法,请回贴。

转载于:https://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html

全排列算法原理和实现相关推荐

  1. 全排列的java算法_全排列算法原理和实现

    评论 # re: 全排列算法原理和实现  回复  更多评论 #include #include #define CHESSNUM 9 using namespace std; /*********** ...

  2. FreeEIM 全排列算法原理和实现

     FreeEIM 全排列算法原理和实现 本文为原创,如需转载,请注明作者和出处,谢谢! 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个.现以{1, 2, 3, 4, 5 ...

  3. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)

    我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...

  4. 全排列算法之回溯求解

    全排列算法回溯实现,重点就在回溯上,只有十分了解回溯的实现原理和工作过程,才能真正掌握回溯算法. 在全排列中,依次将数组的从0到N提到数组的头,再将后面的1-N进行全排列,重点在回溯时,要将之前交换的 ...

  5. 字典序全排列算法(非递归全排列算法)

    非递归全排列算法: 我们先看一个例子. 示例: 1 2 3的全排列如下: 1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1 我们这里是通过字典序法找出来的. ...

  6. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  7. 三维目标检测算法原理

    三维目标检测算法原理 输入输出接口 Input: (1)图像视频分辨率(整型int) (2)图像视频格式(RGB,YUV,MP4等) (3)左右两边的车道线位置信息摄像头标定参数(中心位置(x,y) ...

  8. 3D-2D:PnP算法原理

    3D-2D:PnP算法原理 1.问题背景-- 什么是PnP问题 ? 2.PnP问题的求解方法 2.1 P3P 2.1.1 算法的实际理解 2.1.2 算法的数学推导 2.1.3 算法的缺陷 2.2 直 ...

  9. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

最新文章

  1. 网络工程师_想要记录下来的一些题_1
  2. cxgrid 保存数据_什么是大数据
  3. QT安装由问题的,安装后发现有些控件标签名显示不了
  4. 教程-Win7极速优化20项
  5. SAP ABAP常用正则表达式大全
  6. 单片机小白学步系列(十九) 单片机/计算机系统概述:扩展模块
  7. 右键单击文件夹进入命令行窗口
  8. 阿里二面:group by 怎么优化?
  9. MyBatis--动态插入多条数据
  10. 彭旭老师《一线员工执行力提升训练》
  11. Spring Boot 依赖包讲解
  12. 判断字符串是否是邮箱或者手机号码格式
  13. 【牛客网】马三来刷题之顺时针旋转矩阵
  14. MIT CMS.300 Session 3 – DIGITAL ENVIRONMENTS GAMES 数字环境与游戏
  15. [coreboot]coreboot porting for RISCV
  16. 公务员行测常识积累(持续更新中)
  17. 名帖57 虞世南 小楷《演连珠》
  18. mysql造1000万数据_MySQL制作具有千万条测试数据的测试库
  19. Android基础--首选项(SharedPreferences)
  20. 《信号与系统》笔记·第一章:信号与系统

热门文章

  1. c#实现Socket网络编程
  2. oracle常用的字符和字符串处理类函数
  3. [20190214]11g Query Result Cache RC Latches.txt
  4. JS-Object 对象的相关方法
  5. Butter fly
  6. 不擅演讲的马化腾在 08 年讲了什么?
  7. XMind助你快速解决问题
  8. [转]Laravel 4之URL生成
  9. 关于 Apache Maven 您不知道的 5 件事
  10. Cisco 综合交换实验Dynamips.Net实现方法