全排列函数(next_permutation) 及递归实现全排列

1.全排列函数(next_permutation) 实现

这个函数就是用来求数组的全排列的,至于怎么用,看下面的介绍:

这是一个c++函数,包含在头文件algorithm里面,这个函数可以从当前的数组的大小按照字典序逐个递增的顺序排列

看下面的模板

int a[];
do
{
 
}while(next_permutation);

下面代码可以输出1~n的全排列:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        int a[1000];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);//可以自行测试一下删除后的结果
        do{
            for(int i=0;i<n;i++)
                printf("%d ",a[i]);
            printf("\n");
        }while(next_permutation(a,a+n));  // 每次循环就获取下一个排列 
    }
    return 0;
}

上面代码有一个sort,但是如果没有的话,只会出现从当前的大小按字典序逐个增加的排序

2.递归实现

具体怎么实现的可以动笔画画,先拿个只有3个元素的数组分析,找到其中的规律才是最重要的

#include <stdio.h>
#include <stdlib.h>
int n=0;

void swap(int *a, int *b)
{
     int m;
     m=*a;
     *a=*b;
     *b=m;
}
void perm(int list[], int k, int m)
{
     int i;
     if(k==m)
     {
             for(i=0;i<=m;i++)
                              printf("%d ",list[i]);
             printf("\n");
             n++;
     }
     else
     {
         for(i=k;i<=m;i++)
         {
                          swap(&list[k],&list[i]);
                          perm(list, k+1, m);
                          swap(&list[k], &list[i]);
         }
     }
}       
int main(void)
{
    int list[]={1,2,3,4,5,6,7};
    perm(list,0,6);
    printf("total:%d\n",n);
    system("pause");
    return 0;
}

参考资料:
https://www.cnblogs.com/xianzhedeyu/p/3822946.html
https://www.cnblogs.com/caijiaming/p/9431645.html

发布了75 篇原创文章 · 获赞 34 · 访问量 2018

猜你喜欢

转载自blog.csdn.net/chongchujianghu3/article/details/105301224