全排列

来源:互联网 发布:excel数据透视表教程 编辑:程序博客网 时间:2024/05/09 15:54

    全排列算法有两个比较常见的实现:递归排列和字典序排列

     

    (1)递归实现

    从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而

     

  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4.   
  5. template <typename T>  
  6. void CalcAllPermutation_R(T perm[], int first, int num)  
  7. {  
  8.     if (num <= 1) {  
  9.         return;  
  10.     }  
  11.       
  12.     for (int i = first; i < first + num; ++i) {  
  13.         swap(perm[i], perm[first]);  
  14.         CalcAllPermutation_R(perm, first + 1, num - 1);  
  15.         swap(perm[i], perm[first]);  
  16.     }  
  17. }  
  18.   
  19. int main()  
  20. {  
  21.     const int NUM = 12;  
  22.     char perm[NUM];  
  23.       
  24.     for (int i = 0; i < NUM; ++i)  
  25.         perm[i] = 'a' + i;  
  26.       
  27.     CalcAllPermutation_R(perm, 0, NUM);  
  28. }  

     

     

    (2)字典序排列

    把升序的排列(当然,也可以实现为降序)作为当前排列开始,然后依次计算当前排列的下一个字典序排列。

    对当前排列从后向前扫描,找到一对为升序的相邻元素,记为i和j(i < j)。如果不存在这样一对为升序的相邻元素,则所有排列均已找到,算法结束;否则,重新对当前排列从后向前扫描,找到第一个大于i的元素k,交换i和k,然后对从j开始到结束的子序列反转,则此时得到的新排列就为下一个字典序排列。这种方式实现得到的所有排列是按字典序有序的,这也是C++ STL算法next_permutation的思想。算法实现如下:

     

  29. #include <iostream>  
  30. #include <algorithm>  
  31. using namespace std;  
  32.   
  33. template <typename T>  
  34. void CalcAllPermutation(T perm[], int num)  
  35. {  
  36.     if (num < 1)  
  37.         return;  
  38.           
  39.     while (true) {  
  40.         int i;  
  41.         for (i = num - 2; i >= 0; --i) {  
  42.             if (perm[i] < perm[i + 1])  
  43.                 break;  
  44.         }  
  45.           
  46.         if (i < 0)  
  47.             break;  // 已经找到所有排列  
  48.       
  49.         int k;  
  50.         for (k = num - 1; k > i; --k) {  
  51.             if (perm[k] > perm[i])  
  52.                 break;  
  53.         }  
  54.           
  55.         swap(perm[i], perm[k]);  
  56.         reverse(perm + i + 1, perm + num);  
  57.           
  58.     }  
  59. }  
  60.   
  61. int main()  
  62. {  
  63.     const int NUM = 12;  
  64.     char perm[NUM];  
  65.       
  66.     for (int i = 0; i < NUM; ++i)  
  67.         perm[i] = 'a' + i;  
  68.       
  69.     CalcAllPermutation(perm, NUM);  
  70. }  

     

    Pasted from <http://blog.csdn.net/v_JULY_v/article/details/6313257>

     

0 0
原创粉丝点击