1. 程式人生 > >排列與組合演算法演示

排列與組合演算法演示

排列組合是計算機常用演算法,現在專門用一個小程式演示說明一下:

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的情況。

在這裡插入圖片描述