对于这种全排列我们首先思考是将其中的一个固定住后边的进行变化,再将其中的两个定住后边的变化直接到没有数据,之后再将第二个和第一个交换第二个作为第一个,再重复这个变化,直到所有的数据都成为过第一个
来点实际的例子 比如 对于“abc”这三个字母的全排列: 首先将a固定住 bc进行变化 就是 abc acb 之后恢复原来的abc 再将a和b交换 就是 bac bca 之后恢复原来的abc 下来再将c与a交换 就是cab cba 总共6次全排列
比如 实现简单代码是
void Permutations(char *arr ,int l, int r) //对于 abc 来说 l=0 r = 3; char arr[]="abc"
{
swap(arr[0],arr[0]); //交换aa
Permutations(arr,0,3);
swap(arr[0],arr[0]);//还原aa
swap(arr[0],arr[1]); //交换ab
Permutations(arr,1,3);
swap(arr[0],arr[1]); //还原ab
swap(arr[0],arr[2]); //交换ac
Permutations(arr,1,3);
swap(arr[0],arr[2]); //还原ac
}
具体的还要考虑递归的边界条件和返回
具体代码在底下:
void Permutations(char *p ,int l, int r)
{
if (p== NULL)
{
return;
}
if (l == r)
{
for (int j = 0; j <r; ++j)
{
std::cout << p[j] << " ";
}
std::cout << "\n";
}
else
{
for (int i = l; i < r; ++i)
{
std::swap(p[l], p[i]);
Permutations(p, l + 1, r);
std::swap(p[l], p[i]);
}
}
}
int main(void)
{
char arr[] = "01235";
Permutations(arr, 0,5); //排列的个数是数字个数的阶乘这里是5!
getchar();
return 0;
}