`
椰子面包
  • 浏览: 7183 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

全排列算法

阅读更多

   最简单的方法就是使用递归。例如将一char[n]数组中的字符全排列(假设char[n]数组字符无重复),可把问题理解为:先确定第一个字符,然后将后面n-1个字符全排列,直至只剩一个字符。

    以下是偶从某大侠那里复制过来的实现:



void Perm(char *a, int begin, int end) /* 产生begin到end的全排列 */
{
        int i;
        if(begin == end){             /* 完成一次排列*/
                for(i=0; i<=end; i++)
                        printf("%c",a[i]);
                printf(" ");
        }
        else{
                for(i=begin; i<=end; i++){
                        Swap(a,begin,i);
                        Perm(a,begin+1,end);
                        Swap(a,begin,i);
                }
        }
}

void Swap(char *a, int m, int n)
{
        char temp;
        temp = a[m];
        a[m] = a[n];
        a[n] = temp;
}

   组合相对复杂些。

 

以在n个数中选取m(0<m<=n)个数为例,问题可分解为:
1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止。
2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。

实现就不贴了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics