递归函数生成全排列
2015-03-21 01:16
176 查看
检查n个不同元素的所有排列方式来确定一个最佳的排序。比如a,b,c的排列方式有<<abc,acb,bac,bca,cab,cba>>这六种。
用c++非递归函数实现比较难,用递归实现还是ok的
其核心思想是:将每个元素放到n个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。
比如:
a b c
首先将a放到最前方(跟第一个元素交换),然后排列b c, 然后将a放回本来位置
结果 a b c; a c b
其次将b放到最前方(跟第一个元素交换),然后排列a c,然后将b放回
结果 b a c; b c a
。。。
如果是4个元素,就将元素依次放到第一个元素的位置,后面的排序类似前面的3元素排列
用c++非递归函数实现比较难,用递归实现还是ok的
其核心思想是:将每个元素放到n个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。
比如:
a b c
首先将a放到最前方(跟第一个元素交换),然后排列b c, 然后将a放回本来位置
结果 a b c; a c b
其次将b放到最前方(跟第一个元素交换),然后排列a c,然后将b放回
结果 b a c; b c a
。。。
如果是4个元素,就将元素依次放到第一个元素的位置,后面的排序类似前面的3元素排列
#include <iostream> using namespace std; /* * 函数模板,递归调用对一个数组进行全排列 */ template <class T> void Perm(T list[], int k, int m) { int i; if (k == m)//输出一个全排列 { for (i = 0; i <= m; i++) cout << list[i]; cout << endl; } else //list[k:m]有多个排列方式 //递归的产生这些排列方式 for (i = k; i <= m; i++) { swap(list[k], list[i]);//交换位置,a开始与第一个交换位置 Perm(list, k + 1, m);//下一步就是a后面的与a后面后面的交换位置,知道只有一个数时,就打印 swap(list[k], list[i]);//从后往前交换,将位置还回去,对下一次排列负责 } } //一个测试程序 int main() { char list[] = "abc"; Perm(list, 0, 2); system("pause"); return 0; }
相关文章推荐
- 递归函数生成排列
- 递归函数生成排列
- 用递归函数生成排列组合
- 生成可重集的排列
- 暴力法生成1~n的排列
- 使用递归的方法生成一个序列的所有排列
- 排列组合生成
- 生成排列(DFS)
- 生成可重集的排列模板
- 生成排列列
- 子集生成+stl全排列
- 生成1~n的排列 生成可重集的排列 下一个排列
- 生成全排列方法一
- 入门经典 第七章 7.2.2 生成可重集的排列
- 非递归生成所有排列(knuth)
- [转](阿里笔试)使用多线程和sleep函数生成字符串的伪随机排列
- [Day 1] 7.2.2 生成可重集的排列(包括利用STL)
- 关于生成排列
- MVC扩展生成CheckBoxList并水平排列
- 生成1~n的排列,以及生成可重集的排列