当前位置: 代码迷 >> 综合 >> 打印数组a{1,2,...,n}的全排列(交换)
  详细解决方案

打印数组a{1,2,...,n}的全排列(交换)

热度:87   发布时间:2024-01-21 09:44:35.0

递归思想:
取出数组中第一个元素放到最后,即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]);
                              }
              }
              return;
}

void main(void)
{
              int array[] = {1, 2, 3, 4};
              g_n = sizeof(array) / sizeof(int);
              p(array, g_n);
              return;
}

  相关解决方案