1. 递归算法
1.1 全排列:
全排列表示把集合中元素的所有按照一定的顺序排列起来,使用 P(n, n) = n!
表示n个元素全排列的个数。
例如:{1, 2, 3}的全排列为:
123;
132;
213;
231;
312;
321;
共6个,即3!=321=6。
这个是怎么算出来的呢?
首先取一个元素,例如取出了1,那么就还剩下{2, 3}。
然后再从剩下的集合中取出一个元素,例如取出2,那么还剩下{3}。
以此类推,把所有可能的情况取一遍,就是全排列了,如图:
算法分析:
1)将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素;
2)递归求解s-e中的全排列;
算法实现:
//ilen:数组长度
//istart:数组下标,也即将集合分为两半的s
// 0-------s-------e
// 0 1 2 3 4 5 6 7 8 9
// | |
// iStart j
void fullarray(int a[], int iLen, int iStart) ;
void fullarray(int a[], int iLen, int iStart)
{
if (iLen == iStart) //istart 移至最后,一次全排结束
{
for (int i = 0; i < iLen; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
else
{
//依次将j指向的元素与istart指向的元素交换,求解全排列
for(int j = iStart; j < iLen; ++j)
{
swapint(&a[iStart], &a[j]); //将j指向的数据与istart指向的互换
fullarray(a, iLen, iStart + 1); //求解互换后的a[s+1]-a[e]中的全排列
swapint(&a[iStart], &a[j]); //将互换的j与istart恢复,求解下一种情况
}
}
}