全排列算法的原理和实现代码

 更新时间:2014年08月28日 10:20:01   投稿:junjie  
这篇文章主要介绍了全排列算法的原理和实现代码,全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个,需要的朋友可以参考下

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

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

相关文章

  • C++四种强制转换原理与价值

    C++四种强制转换原理与价值

    这篇文章主要介绍了C++的四种强制转换原理与价值,文中介绍的非常详细,对学习C语言有一定的参考价值,感兴趣的小伙伴可以参考一下
    2023-04-04
  • 关于C++11的统一初始化语法示例详解

    关于C++11的统一初始化语法示例详解

    C++之前的初始化语法很乱,有四种初始化方式,而且每种之前甚至不能相互转换,但从C++11出现后就好了,所以这篇文章主要给大家介绍了关于C++11的统一初始化语法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • C++关于const与引用的分析讲解

    C++关于const与引用的分析讲解

    Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的,引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量
    2022-04-04
  • C++修炼之拷贝构造函数

    C++修炼之拷贝构造函数

    这篇文章主要内容是6个默认成员函数之一的拷贝构造函数的认识与学习,让同学们充分理解浅拷贝与深拷贝,感兴趣的小伙伴可以参考阅读
    2023-04-04
  • C++传值、传址、传引用的区别和选择小结

    C++传值、传址、传引用的区别和选择小结

    参数传递有传值、传址和传引用这三种,本文主要介绍了C++传值、传址、传引用的区别和选择小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • C语言实现单位车辆调度管理

    C语言实现单位车辆调度管理

    这篇文章主要为大家详细介绍了C语言实现单位车辆调度管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Qt实现解压带有密码的加密文件

    Qt实现解压带有密码的加密文件

    Quazip是Qt平台下面的一个压缩解压缩库。本文将利用Quazip实现解压带有密码的加密文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-02-02
  • C语言代码实现简单扫雷小游戏

    C语言代码实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • C++中vector和map的删除方法(推荐)

    C++中vector和map的删除方法(推荐)

    下面小编就为大家带来一篇C++中vector和map的删除方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言实现栈及栈的详解

    C语言实现栈及栈的详解

    这篇文章主要介绍了C语言实现栈及栈的详解,一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,需要的朋友可以参考下
    2023-07-07

最新评论