取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列
1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}
2)如果数组有两个元素n=2,a={1,2} 则全排列是
{2,1}–a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)
{1,2}–a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)
3)如果数组有三个元素n=3,a={1,2,3} 则全排列是
{{2,3},1}–a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)
{{1,3},2)–a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)
{{1,2},3)–a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)
…
以此类推。
马上用C代码实现,成功!
#include <stdio.h>
int g_count = 1;
int g_n = 0;
void print_result(int *a)
{
int i = 0;
printf(“count %d:”, g_count++);
for (i=0; i<g_n; i++)
{
printf(” %d”, a[i]);
}
printf(“\n”);
return;
}
#define swap(a, b)\
{\
int tmp = a;\
a = b;\
b = tmp;\
}
void p(int *a, int size)
{
if (size == 1)
print_result(a);
else
{
int i, tmp = 0;
for (i=0; i<size; i++)
{
swap(a[i], a[size-1]);
p(a, size-1);
swap(a[i], a[size-1]);
}