开发者社区> 问答> 正文

求c语言全排列算法

输入整数n输出所有排列情况~哪个好心人告诉我一下算法就行了~``

展开
收起
知与谁同 2018-07-16 13:31:28 1674 0
3 条回答
写回答
取消 提交回答
  • Nothing for nothing.
    声明一数组,用选择法排序不就行了。
    2019-07-17 22:49:49
    赞同 展开评论 打赏
  • 静静的看着你们
    #include <stdlib.h>
    #include <stdio.h>
    #define N 9
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9,};
    int*pt[N];
    void permutation(int **, int);
    int main(int argc, char *argv[])
    {
    intloop = N;
    while (loop--)
    pt[loop] = &a[loop];
    permutation(pt, 0);
    return EXIT_SUCCESS;
    }
    void permutation(int **ipt, int pos)
    {
    intloop = 0, shift = 0, i = 0;
    int *tmp, *pt_cpy[N];
    if (pos == N-1) {
    while (i++ < N)
    printf("%d ", **ipt++);
    printf("\n");
    return;
    }
    while (shift < N-pos) {
    while (loop < N) {
    pt_cpy[loop] = *ipt++;
    loop++;
    }
    tmp = pt_cpy[pos];
    pt_cpy[pos] = pt_cpy[shift + pos];
    pt_cpy[shift + pos] = tmp;
    shift++;
    permutation(pt_cpy, pos + 1);
    }
    }
    2019-07-17 22:49:49
    赞同 展开评论 打赏
  • 这个说起来太麻烦了, 我找了一个, 你看看行不, 不可以的话, 私聊吧.
    全排列用的是 置换算法,
    算法这东西重在理解。具体代码并不那么重要。

    全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为

    例说明如何编写全排列的递归算法。

    1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。

    由于一个数的全排列就是其本身,从而得到以上结果。

    2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。

    即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.

    从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。

    因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。

    为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

    算法如下:

    #include <stdio.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()
    {
    int list[] = {1, 2, 3, 4, 5};
    perm(list, 0, 4);
    printf("total:%d\n", n);
    return 0;
    }
    链接: http://zhidao.baidu.com/question/71586341.html?si=2
    2019-07-17 22:49:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载