从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1)
递归版本步骤:
在一个位置上选定一个元素,然后递归进入选择下一个元素,直到当前位置等于最后的位置。
#include <iostream>
#include <cstdlib>
void PrintData(int* pData, int size)
{
for (int idx = 0; idx < size; ++idx)
{
std::cout << pData[idx] << " ";
}
std::cout << std::endl;
}
void Permutation(int* pData, int size, int curIdx)
{
if (curIdx == size - 1) // 只剩下一个元素,无需再处理
{
PrintData(pData, size);
return;
}
for (int idx = curIdx; idx < size; ++idx) // 注意这里idx是等于curIdx, curIdx位置上的元素可以选择的区间是[curIdx, size)
{
std::swap(pData[curIdx], pData[idx]); // 固定curIdx位置的元素
Permutation(pData, size, curIdx + 1); // 递归进去
std::swap(pData[curIdx], pData[idx]); // 因为是原地处理,递归推出后需要进行还原
}
}
void Permutation(int* pData, int size)
{
if (nullptr == pData || size <= 1) return;
Permutation(pData, size, 0);
}
int main()
{
int datas[4] = { 1, 2, 3, 4};
Permutation(datas, 4);
return 0;
}