算法思想是归并排序么~3次~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
程序代码:#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define M 5
int ws[120] = {1};
void print(int s[], int n)
{
for (int i = 0; i < n; ++i)
{
printf("%d%c", s[i], "\n "[i < n - 1]);
}
}
static int fac[] = {1, 1, 2, 6, 24, 120};
/*
* 康托展开
*/
int cantor(int sa[M])
{
int result = 0;
for (int i = 0; i < M; i++)
{
int count = 0;
for (int j = i + 1; j < M; j++)
{
count += sa[i] > sa[j];
}
result += count * fac[M - i - 1];
}
return result;
}
/*
* 逆康托展开
*/
void unCantor(int sa[M], int x)
{
int i, j, l, t, h[10] = {0};
for (i = 1; i <= M; i++)
{
t = x / fac[M - i];
x -= t * fac[M - i];
for (j = 1, l = 0; l <= t; j++) if (!h[j]) l++;
h[--j] = 1, sa[i - 1] = j;
}
}
void swap(int sa[M], int beg, int end, int to)
{
int lren = end - beg + 1, sren[lren];
for (int i = beg; i <= end; ++i) sren[i - beg] = sa[i];
int stil[M - end + beg - 1], ltil = 0;
for (int i = 0; i < M; ++i)
{
if (i >= beg && i <= end) continue;
stil[ltil++] = sa[i];
}
int pos = 0;
for (int i = 0; i < to; ++i) sa[pos++] = stil[i];
for (int i = 0; i < lren; ++i) sa[pos++] = sren[i];
for (int i = to; i < ltil; ++i) sa[pos++] = stil[i];
}
void dfs()
{
int sa[M], queue[120] = {0}, f = 0, r = 1;
while (f < r)
{
int now = queue[f++];
for (int beg = 0; beg < M; ++beg)
{
for (int end = beg; end < M; ++end)
{
for (int to = 0; to < M - end + beg; ++to)
{
unCantor(sa, now);
swap(sa, beg, end, to);
int next = cantor(sa);
if (ws[next]) continue;
queue[r++] = next;
ws[next] = ws[now] + 1;
}
}
}
}
}
int main()
{
int sa[M];
dfs();
for (int i = 0; i < 120; ++i)
{
unCantor(sa, i);
printf("step: %d ", ws[i]);
print(sa, M);
}
return 0;
}

[此贴子已经被作者于2017-3-24 23:46编辑过]