全排列 未按字典序

Posted qq77530202

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列 未按字典序相关的知识,希望对你有一定的参考价值。

  1. 思想:从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列
  2. #include <stdio.h>  
  3.   
  4. /************************************************************************/  
  5. /* 功能:实现两个整形参数值交换 
  6. /* 参数: 
  7. /*       lhs--int类型的指针,指向待交换数1的地址 
  8. /*       rhs--int类型的指针,指向待交换数2的地址 
  9. /************************************************************************/  
  10. void Swap(int *lhs, int *rhs)  //有数组尽量用指针//int x  容易出错/
  11. {  
  12.     int t = *lhs;  
  13.   
  14.     *lhs = *rhs;  
  15.     *rhs = t;  
  16. }  
  17.   
  18. /************************************************************************/  
  19. /* 功能:实现全排列功能 
  20. /* 参数: 
  21. /*       source--整数数组,存放需要全排列的元素 
  22. /*       begin --查找一个排列的开始位置 
  23. /*       end   --查找一个排列的结束位置,当begin=end时,表明完成一个排列 
  24. /************************************************************************/  
  25. void FullPermutation(int source[], int begin, int end)  //函数的功能 传入数组 起始点 终止点   将数组全排列
  26. {  
  27.     int i;  
  28.   
  29.     if (begin >= end) // 找到一个排列     !!!!!递归终止条件
  30.     {  
  31.         for (i = 0; i < end; i++)  
  32.         {  
  33.             printf("%d", source[i]);  ////////如 1 2 3 4
  34.         }  
  35.         printf("\n");  
  36.     }  
  37.     else// 没有找完一个排列,则继续往下找下一个元素  
  38.     {  
  39.         for (i = begin; i < end; i++)  
  40.         {  
  41.             if (begin != i)  
  42.             {  
  43.                 Swap(&source[begin], &source[i]); // 交换  
  44.             }  
  45.   
  46.             // 递归排列剩余的从begin+1到end的元素  
  47.             FullPermutation(source, begin + 1, end);  递归式
  48.   
  49.             if (begin != i)  
  50.             {  
  51.                 Swap(&source[begin], &source[i]); // 回溯时还原  
  52.             }   
  53.         }  
  54.     }  
  55. }  
  56.   
  57. int main()  
  58. {  
  59.     int source[30];  
  60.     int i, count;  
  61.   
  62.     scanf("%d", &count);  
  63.   
  64.     // 初始化数组  
  65.     for (i = 0; i < count; i++)  
  66.     {  
  67.         source[i] = i + 1;  
  68.     }  
  69.   
  70.     FullPermutation(source, 0, count);  
  71.   
  72.     return 0;  
  73. }  

以上是关于全排列 未按字典序的主要内容,如果未能解决你的问题,请参考以下文章

java实现-字典序全排列

java字典序全排列

字典序法生成全排列算法图

全排列 (递归求解+字典序) java 转载

排列算法——字典序法

排列算法——字典序法