数的全排列

原创 2015年07月07日 19:45:06

什么是数的全排列呢?这里举个例子:123的全排列是123,132,213,231,312,321。

那么接下来,我们用程序来实现输出1~n的全排列。

解决思路1:使用枚举法,尝试所有的可能性

源代码:

#include <stdio.h>
#include <stdlib.h>
#define N 100

int a[N];
int n = 4;
int m;
int sum = 0;
int book[N] = {0};

void fun(int k)
{
    for(int i = 1; i <= n; i++)
    {
        a[k] = i;
        if(k != 1)
            fun(k - 1);
        else
        {
            for(int j = 1; j <= n; j++)
            {
                book[j] = 0;
            }
            for(int j = 1; j <= n; j++)
            {
                book[a[j]] = 1;
            }
            sum = 0;
            for(int j = 1; j <= n; j++)
            {
                sum += book[j];
            }
            if(sum == n)
            {
                //for(int j = 1; j <= n; j++)
                    //printf("%d ", a[j]);
                // printf("\n");
                m++;
            }
        }
    }
}

int main(int argc, char* argv[])
{
    n = atoi(argv[1]);
    fun(n);
    printf("%d\n", m);
    return 0;
}


解决思路2:使用深度优先搜索,避免无效的组合

源代码:

#include <stdio.h>
#include <stdlib.h>
#define N 100

int a[N];
int n = 4;
int m;
int sum = 0;
int book[N] = {0};

void fun(int k)
{
    int temp;
    for(int i = 1; i <= n; i++)
    {
        if(book[i] != 1)
        {
            temp = a[k];
            if (temp != 0)//如果是第一次,则不需清除原来的标记,若不是,则需要清除原来的标记。
                book[a[k]] = 0;
            a[k] = i;
            book[i] = 1;
        }
        else
            continue;
        if(k != 1)
            fun(k - 1);
        else
        {
            //for(int j = 1; j <= n; j++)
                //printf("%d ", a[j]);
            //printf("\n");
            m++;
        }
    }
    //清除最后一次的标记。
    book[a[k]] = 0;
    //这一轮结束,要把数字也清零
    a[k] = 0;
}

int main(int argc, char* argv[])
{
    n = atoi(argv[1]);
    fun(n);
    printf("%d\n", m);
    return 0;
}


下面是两种算法的执行结果(这里我注释掉了所有情况的输出):

从上面截图可以很清楚看出来,两个算法差距非常大。

                
版权声明:本文为博主原创文章,未经博主允许不得转载。

c++实现数字的全排列

#include #include using namespace std; void recursivePrint(vector number,int length,int index) {...
  • u013676711
  • u013676711
  • 2016年08月31日 11:44
  • 367

全排列生成的迭代算法

Given a collection of distinct numbers, return all possible permutations.目前web上大多数解法都是递归解法,基于“所有的递归算...
  • liushaofang
  • liushaofang
  • 2017年12月04日 23:57
  • 121

深度优先搜索与全排列

做题过程中我们经常会遇到这样的问题: 输入一个数n,输出1-n的全排列。可能很多人会想到枚举暴力,这里给大家介绍一种算法:深度优先搜索 在这里举个简单的例子         假如有编号为1 、2...
  • u013238646
  • u013238646
  • 2015年05月01日 10:19
  • 2788

全排列及相关扩展算法(五)——递增(递减)进位制数求原排列算法

1.引入原因:通过上一章我们意识到通过原始中介数求原排列并不是那么的方便,于是我们延伸出几种新的中介数算法来方便计算原排列。 2.递增进位制数法:递增进位制是指数字的进制随着数字位置的不同递增,一般的...
  • sm9sun
  • sm9sun
  • 2017年08月17日 20:59
  • 886

Java与算法之(4) - 数字全排列

全排列是指n个数(或其他字符)所有可能的排列顺序,例如1 2 3三个数字的全排列是 1 2 3, 1 3 2, 2 1 3, 2 3 1, 3 1 2, 3 2 1 那么问题来了,任意输入一个大于1...
  • autfish
  • autfish
  • 2016年08月31日 16:29
  • 7227

求一个数的全排列的一种思路

今天突然想试一下1,2,3,4,5,的全排列数,思考了一下,解决方案很普通,复杂度极高,是O(n!),首先从第一个数开始,有五种选择,第二个数四种。。。。暴力加回溯就ok。 #include...
  • liuzhan214
  • liuzhan214
  • 2016年03月24日 18:46
  • 261

求数组中任意n个数的全排列

参考http://www.cppblog.com/menjitianya/archive/2015/10/09/211980.html http://blog.csdn.net/lsjseu/art...
  • u011499425
  • u011499425
  • 2016年09月29日 22:23
  • 1828

输出全排列(递归&非递归)

递归算法: 假设总共有n个元素,其核心是:将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。 比如:1 2 3 首先将1放到最前方(跟第1个元素交换),然后...
  • prstaxy
  • prstaxy
  • 2012年11月04日 22:59
  • 7685

全排列数的生成

这学期好忙,整个人都变懒了。。coursera上的课程作业只来得及更新到github上,希望自己以后看着注释还能记得怎么做。。。得空把上学期的一些作业放这里。 【问题描述】输入整数N( 1 ...
  • Jason_Ranger
  • Jason_Ranger
  • 2016年09月20日 13:21
  • 1659

[C++]LeetCode: 115 Permutations (求一组数的全排列)

题目: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the...
  • cinderella_niu
  • cinderella_niu
  • 2015年01月20日 21:34
  • 1829
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数的全排列
举报原因:
原因补充:

(最多只允许输入30个字)