字母全排列快速算法C代码

全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA.
//原理是插入, 在一个字符串的所有位置插入新字符.
//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABC

 1 char *AllList(char *str, int *pNum)
2 {
3     int i, j, k, n;
4     int len = strlen(str);
5     int Total = 0;
6     int count, oldcount;
7     int size;
8     char *Buf;
9     char *p, *p1;
10     if (len > 10) return NULL;
11     //计算总的组合数目
12     for (i = 0, j = 1; i < len; i++)
13     {
14         j *= (len - i);
15         Total += j;
16     }
17     //创建二维数组, 存放全部组合
18     size = len + 1;
19     if ((Buf = (char *)malloc(Total * size)) == NULL)
20     {
21         return NULL;
22     }
23     for (k = 0, count = 0; k < len; k++)  //所有要插入的字符
24     {
25         oldcount = count;
26         p = Buf;
27         p1 = Buf + count * size;
28         for (i = 0; i < oldcount; i++, p += size)  //插入到所有字符串中,形成新的字符串
29         {
30             n = strlen(p);
31             for (j = 0; j <= n; j++, count++, p1 += size) //在字符串所有位置插入
32             {
33                 memcpy(p1, p, n);
34                 p1[n] = p1[j];
35                 p1[j] = str[k];
36                 p1[n + 1] = '

在我的机器上排列10个字母大约0.5秒。

posted @ 2011-12-31 09:12  ×jokey  阅读(665)  评论(0编辑  收藏  举报