目录
希望通过写博客 促进自己学习,都是课本上算法的实现,随课程更新
递归与分治
全排列
基本思路就是分治,大问题化小问题。
假设 R={A B C D},对R进行全排列,会有24种结果。把R划分为{A | B C D},假定A已经排列好了,只需要再排列{B C D}既可。这就可以通过递归来实现了。(第一个排列好的其他划分:{B | A C D} {C | A B D} {D | A B C})
#include <iostream>
#include <cstdio>
#include <cstdlib>
template <class T>
void swap(T &a, T &b) //交换函数
{
T temp;
temp = a;
a = b;
b = temp;
}
void print(char e) //输出函数
{
printf("%c ", e);
}
//perm函数,k为开始位置,m为序列元素个数,void (*print)(T e)为输出函数指针。
//perm函数会从k开始对m个元素进行全排列
template <class T>
void perm(T list[], int k, int m, void (*print)(T e))
{
if(k==m)
{
for(int i = 0; i < m; i++)
print(list[i]);
printf("\n");
}
else
{
for(int i = k; i < m; i++)
{
swap(list[k], list[i]); //两个swap在下面解释
perm(list, k+1, m, print);
swap(list[k], list[i]);
}
}
}
int main()
{
char list[]={'A', 'B', 'C', 'D'};
perm(list, 0, 4, print);
return 0;
}
解释一下两个swap,比如上图,第三行第一个是由ABCD的BC交换得来的,排列完成后,ACBD通过交换变回ABCD,再进行ADBC的排列