Generate permutation for N elements

简介:
原理:这个代码好久之前就会了,可是对于其原理一直一知半解
其实这个算法的原理和我们手动求全排列的过程是一样的,假设有三个元素a, b, c, 我们求他们的全排列时是按照如下的方法
以a开头的有两个
a, b, c
a, c, b
以b开头的有两个
b, a, c
b, c, a
以c开头的有两个
c, a, b
c, b, a
所以一共有六个

一般来说,对于给定的n个元素,首先拿出一个元素放到第一个位置,然后对于剩下的n-1个位置
再从剩下的n-1个元素中拿出一个放在第一个位置(注意:这个第一位置实际是总体的第二个位置),如此往复,直到所有的位置都确定下来就形成了一个排列

比如对于b, a, c这个排列来说
首先在a, b, c这三个元素中拿出b放在第一个位置
然后在剩下的元素a, c中再拿出a放在第一个位置(注意:实际上是总体的第二个位置,因为这是一个递归过程)
最后在剩下的c中拿出c放在第一个位置(实际是总体的第三个位置)

算法是通过不断的与当前的第一个元素进行交换来把某元素放到当前的首位的
比如对于 a, b, c这个排列,其实是如下过程
首先:a与a交换 - a排在a, b, c的首位
其次:b与b交换 - b排在b, c的首位
最后:c与c交换 - c排在c的首位
是不是很笨呢?:)

而对于c, b, a 这个排列来说就是:
首先:c与a交换 - c排在a, b, c的首位
其次:b与b交换 - b排在a, b的首位
最后:a与a交换 - a排在a的首位

代码:
C# version
ContractedBlock.gif Code
C++ version

ContractedBlock.gif Code

C++版的Swap函数还可以写成
1  void  Swap(T  * a, T  * b)
2  {
3      T temp  =   * a ;
4       * =   * b ;
5       * =  temp ;
6  }
但切忌不可写成, 这是值传递,对形参的改变并不影响实参,因为传递进来的是实参的一个副本,交换的仅仅是副本
1  void  Swap(T a, T b)
2  {
3      T temp  =  a ;
4      a  =  b ;
5      b  =  temp ;
6  }

解释一下代码:
void  Perm(T t[],  int  k,  int  m)
t是待排列的数组,k和m是要进行排列的区间,调用的时候传入k=0, m = t.Length - 1就可以对整个数组进行排列了
实际上k和m是当前的排列区间的起点和终点,那么
k = m时,显然排列已经完成
k < m时,排列未完成,则依次取k和m之间的所有元素与当前的首元素交换,然后对区间k + 1, m重复此过程,排列完成后要将交换过的元素再交换

回去,继续下次排列,这就是有两个Swap的原因。


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2009/09/10/1564130.html,如需转载请自行联系原作者

相关文章
|
8月前
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
28 0
LeetCode 153. Find Minimum in Rotated Sorted Array
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。
90 0
LeetCode 153. Find Minimum in Rotated Sorted Array
|
算法
LeetCode Find Minimum in Rotated Sorted Array II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 注意数组中可能存在重复的元素。
69 0
LeetCode Find Minimum in Rotated Sorted Array II
|
索引
LeetCode 81. Search in Rotated Sorted Array II
假设按升序排序的数组在事先未知的某个枢轴处旋转。 (例如, [0,0,1,2,2,5,6] 可能变成 [2,5,6,0,0,1,2]). 给定一个要搜索的目标值T, 如果该目标值能在数组中找到则返回true,否则返回false。
69 0
LeetCode 81. Search in Rotated Sorted Array II
|
算法 Java
简单选择排序(Simple Selection Sort)
算法介绍 算法描述 动图演示 算法分析 代码实现 算法优化 参考
简单选择排序(Simple Selection Sort)
Leetcode-Easy 977. Squares of a Sorted Array
Leetcode-Easy 977. Squares of a Sorted Array
85 0
|
机器学习/深度学习
[LeetCode]--22. Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: [ "((()))", "(()())", "(())()",
1087 0
LeetCode - 33. Search in Rotated Sorted Array
33. Search in Rotated Sorted Array  Problem's Link  ---------------------------------------------------------------------------- ...
730 0