全分列算法的道理和完成代碼。本站提示廣大學習愛好者:(全分列算法的道理和完成代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是全分列算法的道理和完成代碼正文
全分列是將一組數按必定次序停止分列,假如這組數有n個,那末全分列數為n!個。現以{1, 2, 3, 4, 5}為例解釋若何編寫全分列的遞歸算法。
1、起首看最初兩個數4, 5。 它們的全分列為4 5和5 4, 即以4開首的5的全分列和以5開首的4的全分列。
因為一個數的全分列就是其自己,從而獲得以上成果。
2、再看後三個數3, 4, 5。它們的全分列為3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六組數。
即以3開首的和4,5的全分列的組合、以4開首的和3,5的全分列的組合和以5開首的和3,4的全分列的組合.
從而可以揣摸,設一組數p = {r1, r2, r3, ... ,rn}, 全分列為perm(p),pn = p - {rn}。
是以perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。當n = 1時perm(p} = r1。
為了更輕易懂得,將整組數中的一切的數分離與第一個數交流,如許就老是在處置後n-1個數的全分列。
算法以下:
#include <stdio.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
誰有更高效的遞歸和非遞歸算法,請回貼。