排列與組合的C語言實現


排列與組合是數學里的經典問題,由這個問題可引申出子集、字典排序等問題,那么,我們先看經典的排列與組合,怎么在程序里實現。

在網上搜了一下,關注這個問題的人還是挺多的,有不了人給出的回答是使用幾個for循環進行嵌套,例如取3個數的排列則使用3for循環i,j,k嵌套,當i,j,k互不相等時進行輸出,這樣的函數雖然是正確的,但是沒有通用性,我們要實現的是從m中取nmn皆為變量。

 

通過數學公式我們知道,

 

先來看排列的實現,假如集合為{ABC},取出2個的排列為AB AC BA BC CA CB,從這里我們不難看出,第一個字母可從{ABC}中任取一個,假如選了A,第二字母從剩下的集合中{BC}再任選一個,這樣便完成了排列,規則其實很簡單,取n個數,從第一個數開始選,選完之后從集合中去掉這個數,開始選第2個數,一直到取第n個數為止。

 

程序里我們這樣設計,對一個數組里的元素進行排列,我們可將數組分為兩部分,已排集合及未排的集合,每次挑選第i個數時,arr[0]arr[i-1]為已排集合,未排集合為arr[i]arr[m-1],這里從未排集合中依次取出一個元素,交到當前arr[i]的位置,此時未排集合變為arr[i+1]arr[m-1],並開始遞歸選擇i+1個數,直到i=n,選擇結束,請看下圖:

 

 

下面來看組合數的情況,設集合為{ABCD},選則3個數進行組合,組合情況為:

ABC

ABD

ACD

BCD

情況與排列的類似,但有一點不同的是,假設第一個數選了A,則剩下的集合為{BCD},這樣便輸出了所有包含A的組合情況;這時,當第一個數選了B時,則剩下的集合為{CD},而不是{ACD},因為所有包含A的組合已經輸出了,即A已經從當前集合中排除了。

 

程序里我們這樣設計,對一個數組里的元素進行排列,我們可將數組分為兩部分,已選擇的集合及未排的集合,每次挑選第i個數時,arr[0]arr[i-1]為已排元素,未排集合為arr[j]arr[m-1],這里未排集合中依次取出一個元素,假設為arr[k],其中k[j,m-1]之間,交換到當前arr[i]的位置,此時未排集合為arr[k+1]arr[m-1],並開始遞歸選擇i+1個數,直到i=n,選擇結束。

 

【查看完整代碼實現】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM