全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n!個。現以為例說明如何編寫全排列的遞迴演算法。
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 = , 全排列為perm(p),pn = p - 。
因此perm(p) = r1 perm(p1), r2 perm(p2), r3 perm(p3), ... , rn perm(pn)。當n = 1時perm(p} = r1。
為了更容易理解,將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n-1個數的全排列。
演算法如下:
#include
<
stdio.h
>
intn =0
; void
swap(
int*
a, int
*b)
void
perm(
intlist,
intk,
intm)
else
} }
intmain()
;
perm(list, 0,
4);
printf(
"total:%d/n
", n);
return0;
} 同作者一樣,希望大家有更好的演算法上傳
求全排列演算法簡單的實現
求全排列演算法實現 一 遞迴實現 假如是乙個陣列,無重複元素的全排列,其簡單的遞迴實現演算法思想如下 假如 allsort a b c 分治思想化為a allsort b c b allsort a c c allsort a b 遞迴一層後計算第二層時 如allsort b c 時,化為b all...
乙個蛇形排列演算法(C )
問題 有這樣一類問題,例如新生入學分班,現有100名新生,要分到4個班級裡,要求每個班級的學生成績基本平均。假設新生的入學分數就是100,99,98,97,96,95,3,2,1。分班結果如下 0班 1班 2班 3班 100 99 98 97 93 94 95 96 92 91 90 89 85 8...
排列演算法彙總(下乙個排列,全排列,第K個排列)
一 下乙個排列 首先,stl提供了兩個用來計算排列組合關係的演算法,分別是next permutation和prev permutation。next permutation nums.begin nums.end 下乙個排列 prev permutation nums.begin nums.end...