一、概述
全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。
二、递归实现
2.1、实例一
例如,如果集合是{a,b,c},那么这个集合中元素的所有排列是{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)},显然,给定n个元素共有n!种不同的排列,如果给定集合是{a,b,c,d},可以用下面给出的简单算法产生其所有排列,即集合(a,b,c,d)的所有排列有下面的排列组成:
(1)以a开头后面跟着(b,c,d)的排列
(2)以b开头后面跟着(a,c,d)的排列
(3)以c开头后面跟着(a,b,d)的排列
(4)以d开头后面跟着(a,b,c)的排列,这显然是一种递归的思路,于是我们得到了以下的实现:
using namespace std;
void permutation(char* a,int k,int m)
{
int i,j;
if(k == m)
{
for(i=0;i<=m;i++)
cout<<a[i];
cout<<endl;
}
else
{
for(j=k;j<=m;j++)
{
swap(a[j],a[k]);
permutation(a,k+1,m);
swap(a[j],a[k]);
}
}
}
int main(void)
{
char a[] = "abc";
cout<<a<<"所有全排列的结果为:"<<endl;
permutation(a,0,2);
system("pause");
return 0;
}
2.2、STL实现
有时候递归的效率使得我们不得不考虑除此之外的其他实现,很多把递归算法转换到非递归形式的算法是比较难的,这个时候我们不要忘记了标准模板库已经实现的那些算法,这让我们非常轻松。STL有一个函数next_permutation(),它的作用是如果对于一个序列,存在按照字典排序后这个排列的下一个排列,那么就返回true且产生这个排列,否则返回false。注意,为了产生全排列,这个序列要是有序的,也就是说要调用一次sort。实现很简单,我们看一下代码:
#include "iostream"
#include "algorithm"
using namespace std;
void permutation(char* str,int length)
{
sort(str,str+length);
do
{
for(int i=0;i<length;i++)
cout<<str[i];
cout<<endl;
}while(next_permutation(str,str+length));
}
int main(void)
{
char str[] = "acb";
cout<<str<<"所有全排列的结果为:"<<endl;
permutation(str,3);
system("pause");
return 0;
}
2.3、有一定约束条件的全排列
对数1,2,3,4,5要实现全排序。要求4必须在3的左边,其它的数位置随意。
思路:首先使用上面的2种方法之一实现全排列,然后对全排列进行筛选,筛选出4在3左边的排列。
using namespace std;
void permutation(int* a,int length)
{
int i,flag;
sort(a,a+length);
do
{
for(i=0;i<length;i++)
{
if(a[i]==3)
flag=1;
else if(a[i]==4)
flag=2;
}
if(flag==1)
{
for(i=0;i<length;i++)
cout<<a[i];
cout<<endl;
}
}while(next_permutation(a,a+length));
}
int main(void)
{
int i,a[5];
for(i=0;i<5;i++)
a[i]=i+1;
printf("%d以内所有4在3左边的全排列结果为:\n",i);
permutation(a,5);
system("pause");
return 0;
}
转自:http://blog.csdn.net/hackbuteer1/article/details/6657435
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
### PHP全排列递归算法详解 #### 算法背景与应用场景 在计算机科学领域,全排列算法是一种常见的数据处理技术,广泛应用于密码学、组合数学以及编程竞赛等多个场景。通过对一组元素的所有可能顺序进行计算,可以...
### Python字符串的全排列算法实例详解 #### 一、引言 在计算机科学中,全排列问题是一个常见的问题,尤其在解决密码学、组合优化等领域时尤为重要。全排列指的是从给定的一些元素中取出全部元素进行排列的方式。...
内容概要:本文详细介绍了Java中的递归算法,涵盖递归的基础概念、注意事项、经典问题及其解决方案。首先解释了递归的基本定义和核心要素,强调了递归条件和基线条件的重要性。接着讨论了常见的递归问题,如阶乘计算...
【C#递归算法详解】 递归算法是编程中一种重要的技术,特别是在C#这样的面向对象语言中。它涉及到函数自身调用自身的过程,通过解决更小规模的问题来解决整个问题。递归算法的核心概念包括两个关键部分:基础情况...
### word版全排列生成算法详解 #### 一、引言 在计算机科学中,全排列问题是一个非常重要的基础概念,广泛应用于密码学、组合优化、数据挖掘等领域。本篇文章将详细介绍几种常见的全排列生成算法,包括字典序法、...
全排列问题是一个经典的计算机科学问题,它涉及到排列组合和递归算法。在C++中,解决全排列问题的一种有效方法是使用递归交换法。这种方法虽然在思路上有类似暴力枚举,但通过巧妙地利用交换操作,可以在一定程度上...
本文将详细介绍几种C语言实现全排列的算法,并结合“排列组合ppt详解及源代码”进行深入解析。 1. **回溯法**: 回溯法是一种试探性的解决问题方法,当发现某一步选择不正确时,可以退回一步甚至多步,重新选择...
全排列算法是计算机科学中的一种经典算法,主要应用于数据处理和组合优化问题。在C++中,实现全排列可以通过多种方法来完成,其中一种常见的方式是利用递增进位制和递减进位制数的概念。本文将深入探讨这两种进位制...
### 递归求全排列算法详解 #### 一、引言 在计算机科学与数学领域,全排列问题是一项基础且重要的研究课题。全排列是指从一组元素中选取所有元素进行排列的所有可能组合,确保每种排列都是唯一的。递归算法因其简洁...
### Java 实现的经典递归算法三例详解 #### 一、汉诺塔问题 汉诺塔(Tower of Hanoi)是一种经典的递归问题,在计算机科学领域有着广泛的应用。该问题通常表述为:有三个柱子 A、B 和 C,以及 n 个不同大小的圆盘。...
C++实现全排列算法详解 C++实现全排列是算法中的一种常见问题,解决该问题可以使用递归和非递归两种方法。递归方法可以通过不断地选择每个元素来生成全排列,但是这种方法在元素个数很多时很容易造成堆栈溢出,因此...
递归算法虽然简洁易懂,但在处理大数据量时可能会导致栈溢出等问题。因此,掌握非递归的全排列算法对于提升程序的性能至关重要。本文将详细介绍一种基于Python语言的非递归全排列实现方法,并通过具体的代码示例进行...
### 重复元素全排列算法详解 #### 知识点一:重复元素全排列定义与应用场景 **重复元素全排列**是指在一组包含重复元素的集合中找到所有可能的不同排列方式。这种排列允许相同元素出现多次,但每个排列视为不同的...
### C语言中的常见算法知识点详解 ...以上是关于C语言中二叉树中序输出、全排列递归算法以及字符串处理函数trim的相关知识点的详细介绍。通过理解和掌握这些基本算法,可以帮助开发者更好地应对软件考试中的相关题目。
本篇主要介绍如何利用C语言中的递归算法来实现一个数组的所有全排列。通过提供的代码示例,我们可以深入理解递归算法的工作原理以及如何在实际编程中应用它来解决特定问题。 #### 二、递归算法简介 递归算法是一种...
全排列是一种对给定序列进行不重复的元素重排的算法。在PHP中实现字符串的全排列,可以通过递归和回溯法来完成。递归是函数自我调用的一种过程,而回溯法是一种通过尝试不同的解决方案来找到所有解决方案的算法。 ...
本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等。 2. 排列算法 常见的排列算法有: (A)字典序法 (B)递增进位制数法 (C)递减进位制数法 (D)邻位对换法 (E)递归法 介绍常用的两种...
这个算法的核心在于对字符串进行全排列,然后通过特定的逻辑来过滤掉含有连续重复字符的排列。 首先,作者提供了算法的基本思路: 1. 对字符串进行全排列。 2. 生成排列的过程中,避免产生含有连续重复字符的排列。...