排列與組合演算法演示
阿新 • • 發佈:2018-12-20
排列組合是計算機常用演算法,現在專門用一個小程式演示說明一下:
01 組合演算法
/* 程式說明:實現組合邏輯,即實現從N個元素中取出M個元素 */ #define MAX_LEN 1024
int top = 0; int que[MAX_LEN]; int numArray[5] = {1,2,3,4,5}; void output(int que[], int top){ for(int i=0; i< top; i++){ printf("%d",que[i]); } printf("\n"); } void comb(int idx, int n, int m){ if(idx>n) return; if(top ==m) output(que,top); //output(que,top); que[top++]=numArray[idx]; comb(idx+1, n, m); top--; comb(idx+1, n, m); } int main(int argc, char *argv[]){ comb(0, 5, 3);//numArray陣列組合5選3 return 0; }
/* 組合程式說明: 開啟註釋語句並將其上一條語句註釋,即可觀察堆疊的變化,如下: 1 12 123 1234 123 12 124 12 1 13 134 13 1 14 1
2 23 234 23 2 24 2
3 34 3
4
說明:上述結果說明,在堆疊進出的過程中,可能出現滿足條件的重複列印.如123 */
02 排列演算法
/* 程式說明:實現排列邏輯,即M個元素的全排列 演算法思想是:利用flag陣列作為標記,讓每個元素在每個位置都有佔位的機會 */
int flag[MAX_LEN] = {0}; void perm(int s, int n) { if(s>n) return; if(s==n) output(que,n); for(int i=0; i<n; i++) { if(flag[i] ==0){ flag[i]=1; que[s]=numArray[i]; perm(s+1,n); flag[i]=0; } } } int main(int argc, char *argv[]){ perm(0,3);//numArray前三個元素的全排列 return 0; }
03 引申思考
比如一個數組長度為5,其所有的元素組合,可以被看成00001- 11111的變化,而組合屬於選擇問題:比如5選3,即是從00001-11111數字中,滿足3個位都是1的情況。