c/c++算法 排列组合问题

个人博客排列表示把集合中元素按照一定的顺序排列起来。

组合指从n个不同元素中取出m个元素来组成的一个组,这个组内元素没有顺序。

(1)排列问题:

{1, 2, 3}的全排列为:

123;132;

213;231;

312;321;

这是怎么写出来的呢?先看下面这幅图。

排列

将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。

个人博客c语言代码如下:

void perm(int list[], int s, int e, void (*cbk)(int list[])) 
{     
    int i;
    if(s > e)     
    {
        (*cbk)(list);
    }
    else    
    {         
        for(i = s; i <= e; i++)
        {             
             swap(list, s, i);             
             perm(list, s + 1, e, cbk);             
             swap(list, s, i);         
        }
    }
}

其中:

void swap(int * o, int i, int j)
{
    int tmp = o[i];
    o[i] = o[j];
    o[j] = tmp;
}

void cbk_print(int * subs)
{
    printf("{");
    for(int i = 0; i < LEN; i++)
    {
        printf("%d", subs[i]);
        (i == LEN - 1) ? printf("") : printf(", "); 
    }
    printf("}\n");
}


(2)组合问题

从{1,2,3,4}中取出2个元素的组合为:

121314
2324
34

看下面这幅图:
zuhe

每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。

个人博客C语言代码如下:

void combine(int s[], int n, int k, void (*cbk)(int * subset, int k))
{
    if(k == 0)
    {
        cbk(subset, k);
        return;
    }

    for(int i = n; i >= k; i--)
    {
        subset[k-1] = s[i-1];
        if(k > 1)
        {
            combine(s, i-1, k-1, cbk);
        }
        else
        {
            cbk(subset, subset_length);
        }
    }
}
nike官網  中山网站建设   荆州SEO  中山跆拳道  中山律师
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值