程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 全分列算法的道理和完成代碼

全分列算法的道理和完成代碼

編輯:關於C++

全分列算法的道理和完成代碼。本站提示廣大學習愛好者:(全分列算法的道理和完成代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是全分列算法的道理和完成代碼正文


全分列是將一組數按必定次序停止分列,假如這組數有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; 
}

誰有更高效的遞歸和非遞歸算法,請回貼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved