本算法的思想十分简单。
1.如求(1,2,3)的排列,程序按如下方式分解:
要求(123)的全排列就是求1(23)、2(13)、3(12)的全排列,而1(23)又可看做是求12(3)、13(2)的全排列。所以程序整体的思想就是每次先从待排列元素中取出一个元素tmp= findfirst()作为已排列元素,然后对剩下的待排列元素继续执行此过程,直到待排列元素只剩下一个迭代结束。然后需要恢复本次迭代之前选择第一个元素时的原排列,比如当选择到12(3)时,恢复到上一级就是1(23)。然后对(23)执行tmp=findnext(tmp),即返回待排序元素中的tmp=2之后的一个元素,在这里就是3,所以下次状态就是:13(2)。
2.程序中真正使用到的排序算法只有18行,主要是因为在程序中定义了一个集合类,在集合类中封装有set容器,在其中存放待排列的元素,类中主要方法包括:
(1)const Comparable & findFirst() //返回容器a中的第一个元素 (2)const Comparable & findNext(Comparable &tmp) //返回元素tmp之后的下一个元素 (3)void insert(const Comparable &value) //向a中插入元素value (4)Union & erase(const Comparable &value)