书上算法排列问题
2018-01-05 16:42
197 查看
思想:排列问题最主要是Perm()函数,例如一个很简单的例子如下: 数列是:1 2 3 当n=1时,则递归出口,换种说法就是当n=m时,也就是数列中只剩下一个数的时候,则表示交换已经结束,此时需要把这一排打印出来。 当n<m时,说明没有交换结束,则继续交换下去,但是需要注意的是,当每次我交换完之后,也是就递归结束时,我需要把数列还原为原来的数列,不然,在进行交换输出后会得不到全部,而且还会有重复; 下面我以1 2 3为例举例子然后进行理解理解: 第一次:1 2 3为本身,因为一开始都是本身和本身进行交换,所以在递归结束后,交换后缀还是本身。 第二次:1Perm(2,3);也就是1被分割出去,然后进行交换2和3;变为1 3 2 。。。。。。。。。。。。。以此下去;;;;;; 1 2 3 1 2 3 2 3 1 3 1 2 3 2 3 1 2 1#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
template<class Type>
inline void Swap(Type &a,Type &b)///实现两个数的交换位置
{
Type temp=a;
a=b;
b=temp;
}
template<class Type>
void Perm(Type list[],int k,int m)///进行全排列
{
if(k==m)///递归的出口,当只剩下一个数的时候,则输出数列
{
for(int i=0;i<=m;i++)///
cout<<list[i]<<" ";
cout<<endl;
}
else
{
for(int i=k;i<=m;i++)
{
Swap(list[k],list[i]);///进行交换位子
Perm(list,k+1,m);///(k+1的全排列)
Swap(list[k],list[i]);///还原原来的数组
}
}
}
int main()
{
int n;
cin>>n;
int list
;
for(int i=0;i<n;i++)
cin>>list[i];
Perm(list,0,n-1);
return 0;
}
相关文章推荐
- Java 算法设计 多数组排列组合问题
- 算法实现(1)排列问题
- 排列组合问题的通用算法
- Golang排列组合算法问题之全排列实现方法
- 排列组合问题的通用算法
- 算法之排列问题
- 算法-全排列问题
- 全排列问题算法分析与实现(递归、非递归)
- 数据结构与算法问题 [NOIP2001]求先序排列
- 全排列算法递归及STL实现,八皇后问题
- 全排列算法问题
- 【算法总结】 排列组合问题 - backtracking
- 全排列问题算法及实现(Permutation)
- c语言实现排列组合算法问题
- 算法竞赛一些基础问题的复习(java) 1(大水仙花数、韩信点兵、倒三角、排列)
- 排列的字典序问题 算法与设计
- 算法实现(2)有重复元素的排列问题
- 算法题-排列组合问题
- 求全排列问题的算法
- 算法问题(2)输出全排列