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

全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA。

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

//cczlp
//原理是插入, 在一个字符串的所有位置插入新字符.
//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABC
void AllList(TStringList *lst, AnsiString str)//原理, 速度慢
{
    int i, j, k;
    int len;
    int count;
    AnsiString as;

    for (k = 1; k <= str.Length(); k++)  //所有要插入的字符
    {
        count = lst->Count;

        for (i = 0; i < count; i++) //插入到所有字符串中,形成新的字符串
        {
            len = lst->Strings[i].Length();
            for (j = 1; j <= len + 1; j++)  //在字符串所有位置插入
            {
                as = lst->Strings[i];
                lst->Add(as.Insert(str[k], j));
            }
        }
        lst->Add(str[k]);
    }
}

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] = '\0';
            }
        }
        Buf[count * size] = str[k];
        Buf[count++ * size + 1] = '\0';
    }

    *pNum = count;  //排列总数
    return Buf;
}
DWORD  __fastcall  Getms(void)
{
    static __int64 freq = 0;
    LARGE_INTEGER t1;

    if (freq == 0)
    {
        QueryPerformanceFrequency(&t1);
        freq = t1.QuadPart;
    }
    QueryPerformanceCounter(&t1);
    return t1.QuadPart * 1000.0 / freq;
}

void __fastcall TForm1::Button5Click(TObject *Sender)
{
    DWORD t1, t2;   //4567890
    char *str = "ABCDEFGHIJ";
    TStringList *lst = new TStringList;
    t1 = Getms();
    AllList(lst, str);
    t2 = Getms();
    // Memo1->Text = lst->Text;
    delete lst;
    Memo1->Lines->Add(IntToStr(t2 - t1));
    int num;
    char *Buf;
    int len = strlen(str);
    t1 = Getms();
    Buf = AllList(str, &num);
    t2 = Getms();
    Memo2->Lines->Add(IntToStr(t2 - t1));
    free(Buf);
}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值