排列组合 C语言实现

原创 2016年06月04日 23:15:11
#include <stdio.h>
#include <stdlib.h>

int array[] = {1,2,3,4};

#define N  4
#define M  3
int results[N] = {0}; //保存已经找到的结果前缀数组
int results_end = 0; //结果前缀数组有效数据下标
int is_used[N] = {0}; //是否已经排列过了的标志

/**
 * 排列
 * @param deep 递归深度
 * @param n 数组最大长度
 */
void perm(int deep, int n)
{
    int i;
    if (deep > n) // 越界递归结束
    {
        return;
    }

    if (deep == n) // 找到结果,打印,递归结束
    {
        for (i = 0; i < n; i++)
        {
            printf("%d", results[i]);
        }
        printf("\t");
        return ;
    }

    for (i = 0; i < n; i++)
    {
        if (is_used[i] == 0)
        {
            is_used[i] = 1;
            results[deep] = array[i];
            perm(deep+1, n);
            is_used[i] = 0;
        }
    }
}

/**
 * 组合
 * @param deep 递归深度
 * @param n 数组最大长度
 * @param m 要查找的组合的长度
 */
void comb(int deep, int n, int m)
{
    int i = 0;
    if (deep > n) // 越界递归结束
        return ;
    if (results_end == m) // 找到结果,打印,递归结束
    {
        for (i = 0; i < m; i++)
        {
            printf("%d", results[i]);
        }
        printf("\t");
        return ;
    }
    results[results_end++] = array[deep];
    comb(deep+1, n, m); //向下一级递归
    results_end--;
    comb(deep+1, n, m); //向下一级递归
}

int main()
{
    int i = 0;
    printf("全排列:\n");
    perm(0, N);
    printf("\n1~%d的所有组合:\n", N);
    for(i=1; i<=N; i++){
        comb(0, N, i);
    }
    printf("\n");
    return 0;
}

运行结果
[root@centos6 data]# gcc test.c
[root@centos6 data]# ./a.out
全排列:
1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
1~4的所有组合:
1 2 3 4 12 13 14 23 24 34 123 124 134 234 1234


始于2010-12-30,Tencent;更新至2016-06-02,杭州。

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

排列和组合算法 C语言经典实现

排列和组合算法是考查递归的常见算法,这两种算法能用递归简洁地实现。 本人在经过多次摸索和思考之后,总结如下,以供参考。 程序代码如下:  1 #include  2 #includ...
  • huangkangying
  • huangkangying
  • 2011年10月12日 17:51
  • 25725

C语言实现排列组合

c语言实现排列组合算法问题 排列组合是算法常用的基本工具,如何在c语言中实现排列组合呢?思路如下: 首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消...
  • wangshengfeng1986211
  • wangshengfeng1986211
  • 2014年08月04日 11:02
  • 20035

c语言实现排列组合算法问题

排列组合是算法常用的基本工具,如何在c语言中实现排列组合呢?思路如下: 首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消耗大量的栈空间,如果线程栈空间不够,那么就运行不下去了...
  • lanmo555
  • lanmo555
  • 2014年03月28日 16:29
  • 3828

{C语言算法}排列组合

#include #include #define NDEBUG #include int print_flag(int flag[],int data[]) {  ...
  • cjqqschoolqq
  • cjqqschoolqq
  • 2013年03月17日 17:46
  • 423

C语言实现数学上的组合和排列

今天想用C语言实现下数学上的组合和排列,一直很郁闷。 上网搜索到一个例子:   #include #include //从n个元素的数组a中,取m个元素的组合 bool zuhe(cha...
  • nick870208
  • nick870208
  • 2013年05月24日 17:00
  • 1130

c语言排列组合还可以这样求

本文主要讲编程比赛中常用的排列组合。 首先,排列组合的公式是(其中P代表的就是A) 最普通的算法就是按照公式求了,即分子算出来,分母算出来,然后相除,写成代码为: int c( int m,int ...
  • qq_39627843
  • qq_39627843
  • 2017年08月19日 11:07
  • 231

全排列与全组合的非递归C语言实现

/***Perm.h*****/ #ifndef _ALGORITHM_PERM_H #define _ALGORITHM_PERM_H #include //回调函数, 每个排列或组合的结果均做为...
  • robin51201
  • robin51201
  • 2017年06月22日 15:29
  • 499

c语言实现的排列组合程序

  • 2009年06月25日 21:05
  • 282KB
  • 下载

C语言实现的全排列算法

程序的主要思路是: 1.把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。 2.把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。 3.把第...
  • qq_33901297
  • qq_33901297
  • 2016年08月06日 10:16
  • 4959

c语言递归全排列问题

#include"stdio.h" #define SWAP(a,b,c) ((c)=(a),(a)=(b),(b)=(c)) void perm(int *list,int i,int n)...
  • huayutiancheng
  • huayutiancheng
  • 2016年08月27日 20:08
  • 2070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排列组合 C语言实现
举报原因:
原因补充:

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