问题
设计一个递归算法生成 n 个元素 {r1, r2,…, rn} 的全排列。
算法分析
设R={r1,r2,r3,…,rn}为要排序的N个元素,集合X的全排列为Perm(X);Ri=R-{ri},那么(ri)Perm(Ri)表示首元素为ri,其余元素
为Ri的全排列。
故R的全排列可定义为:
1、当R中只有一个元素r时,Perm( R )={r};
2、当R中有n个元素时,Perm( R )={(r1)Perm( R1 ),(r2)Perm( R2 ),…,(rn)Perm( Rn )}。
// perm
#include <iostream>
#include <fstream>
using namespace std;
int times=0;
ifstream infile;
ofstream outfile;
void perm(char a[],int start,int end) {//递归,假设待排序列为abcdef对应着_ _ _ _ _ _
//只需要随机选取任意一个字符填入第一位置,然后剩余的字符进行排序操作
//直至最后一个元素,只有一种排列方法,跳出递归。
if (start == end) {//头尾相同表示只剩最后一个元素了
for (int i = 0; i <= end; i++)
outfile << a[i]<<" ";
outfile << endl;
times++;
}
else
{
for (int i = start; i <= end; i++) {//确定当前位置放置哪个字符
swap(a[i], a[start]);//交换已经选择字符和初始字符的位置,生成新的待排序序列
perm(a, start + 1, end);//递归,进行下一步排序
swap(a[i], a[start]);//排序完成后,还要交换成原始待排顺序,否则排序会出现重复
}
}
}
int main() {
int n;
infile.open("input.txt");
outfile.open("output.txt");
infile >> n;
char *a = new char(n);
for (int i = 0; i < n; i++)
infile >> a[i];
outfile << "全排列为:" << endl;
perm(a,0,n-1);
outfile << "全排列个数为:"<<times;
}
输入
输出
算法复杂度
算法复杂度:O(n!)