对排列和组合不知道怎么办了

对排列和组合比较陌生,所以,希望大神能解释一下————初学者,最好用C语言,嘿嘿,太复杂的看不懂。

排列组合的定义:
http://blog.sina.com.cn/s/blog_6e5bd60d0100uo49.html

c语言举例:
http://blog.csdn.net/tjyyyangyi/article/details/7906677

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

perm(set, s, e)
{

    顺序从s~e中选出一个元素与s交换(即选出一个元素)
    调用perm(set, s + 1, e)
    直到s>e,即剩余集合已经为空了,输出set
}
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;
}
 组合,每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。

comb(set, subset, n, k)
{

    反向从集合中选出一个元素,将这个元素放入subset中。
    调用comb(set, subset, 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);
        }
    }
}