以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  快速全排列字母(算法)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87473)


--  作者:葛靖青001
--  发布时间:11/4/2010 4:51:00 PM

--  快速全排列字母(算法)
全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA.

  //原理是插入, 在一个字符串的所有位置插入新字符.

  //如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABC

  char *AllList(char *str, int *pNum)

  {

  int i, j, k, n;

  int len = strlen(str);

  int Total = 0;

  int count, oldcount;

  int size;

  char *Buf;

  char *p, *p1;

  if (len > 10) return NULL;

  //计算总的组合数目

  for (i = 0, j = 1; i < len; i++)

  {

  j *= (len - i);

  Total += j;

  }

  //创建二维数组, 存放全部组合

  size = len + 1;

  if ((Buf = (char *)malloc(Total * size)) == NULL)

  {

  return NULL;

  }

  for (k = 0, count = 0; k < len; k++)  //所有要插入的字符

  {

  oldcount = count;

  p = Buf;

  p1 = Buf + count * size;

  for (i = 0; i < oldcount; i++, p += size)  //插入到所有字符串中,形成新的字符串

  {

  n = strlen(p);

  for (j = 0; j <= n; j++, count++, p1 += size) //在字符串所有位置插入

  {

  memcpy(p1, p, n);

  p1[n] = p1[j];

  p1[j] = str[k];

  p1[n + 1] = '

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


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms