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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值