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

本文详细阐述了使用递归思想解决数组全排列问题的方法,并提供了C语言代码实现。通过逐步交换数组元素并递归求解子问题,最终得到数组的所有可能排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


递归思想:
取出数组中第一个元素放到最后,即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、付费专栏及课程。

余额充值