您的位置:首页 > 其它

递归函数生成全排列

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元素排列

#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: