33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 元素数量
#define ELEM_SIZE 11
// 打印元素排列
void printString(char s[], int list[], int size);
// 初始化数组
void initList(int list[], int size);
// 字典序生成组合
void combinDict(char s[], int n, int k);
int main(void)
{
clock_t ct;
// 定义 ELEM_SIZE + 1个元素数组,使下标与值相对应
int k;
char s[ELEM_SIZE + 2] = "0ABCDEFGHIJk";
ct = clock();
// 字典序生成组合
for (k = 1; k <= ELEM_SIZE; k++)
{
combinDict(s, ELEM_SIZE, k);
}
ct = clock() - ct;
printf("time : %f\n", (double)ct / CLK_TCK);
return 0;
}
void initList(int list[], int size)
{
int i;
// 使 list[0] 为有符号最大值
list[0] = ~0U >> 1;
// 生成数组
for (i = 1; i <= size; i++)
{
list[i] = i;
}
}
void combinDict(char s[], int n, int k)
{
int i, j, *list, *blist;
i = k;
list = calloc(sizeof(int), n + 1);
blist = calloc(sizeof(int), k + 1);
// 初始化数组
initList(list, n + 1);
// 打印第一个元素组合
printString(s, list, k + 1);
// 字典序算法
while (i > 0)
{
if (list[i] < n - k + i)
{
// 生成 blist[i]
blist[i] = list[i] + 1;
// 若 i 不是最后一个元素k
if (i < k)
{
j = i + 1;
// 生成 blist[i + 1]...[k]
while (j <= k)
{
blist[j] = blist[j - 1] + 1;
j++;
}
}
// 使list[i]...[k] = blist[i]...[k]
while (i <= k)
{
list[i] = blist[i];
i++;
}
// 打印元素组合
printString(s, list, k + 1);
i = k;
}
else
{
i--;
}
}
}
void printString(char s[], int list[], int size)
{
int i;
for (i = 1; i < size; i++)
{
printf("%c", s[list[i]]);
}
printf("\n");
}