全排列 c语言详解 按照大小后排列

从n个不同元素任取m(m<=n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的排列情况叫全排列。现输入n个递增的数,请你输出这n个数的全排列。全排列输出顺序如样例所示。

###输入格式:
第一行先输入一个整数n(1<=n<=10)。

接下来是一行输入n个由空格分开的互不相同的整数num (1 <= num <= 90000)。

###输出格式:
对于每组数据,每一种排列占一行,各元素间用逗号隔开。

###输入样例:

3
1 2 3

###输出样例:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include<stdio.h>
int n;
int a[11];
void swap(int p,int q){
    int t;
    t=a[q];
    //循环每个元素后移
    for(int i=q;i>=p+1;i--){
        a[i]=a[i-1];
    }
    a[p]=t;
}
// 4 1 2 3
//1 2 3 4
void swapback(int p,int q){
    int t=a[p];
    for(int i=p;i<=q-1;i++){
        a[i]=a[i+1];
    }
    a[q]=t;
}
void perm(int p,int q){
    int i;
    if(p==q){
        for(i=0;i<=q;i++){
            if(i==q) printf("%d\n",a[i]);
            else printf("%d,",a[i]);
        }
    }
    else {
        for(i=p;i<=q;i++){
            swap(p,i);
            perm(p+1,q);
            swapback(p,i);
        }
    }
}
int main(){
    
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    perm(0,n-1);    
    return 0;
}

第一个swap函数

作用是将每一个元素都作为开头

这样就有了

1开头的全排列

123

132

2开头的全排列

213

231

3开头的全排列

312

321

p是数列的边界,q是数列的右边界

将p也就是第一个位置  与后面的所有位置的进行交换

第二个函数也就是递归函数

排列123

排完1之后 我们只需要在排列23 32即可  这也就是递归的调用

同理如果是多个数据的话

12345

只需要排列1 后排列 2345  排2的时候 在去排列345 再排列45 

但是如果是这样的话

模拟运行一下

123

然后是132

当再进行交换的时候

是此时处于第二个位置的3与1进行交换

所以是3开头 便不是想要的2开头的了

所以需要再进行换回来

可是如果只是简单的换回来

同时每次

eg:

1234

4123是我们想要的  而不是4231

所以每次交换是后面的整体后移

同理换回来的时候

4123

1234

将首位保存后依次前移

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值