现在的位置: 首页 > 综合 > 正文

N个数全排列的非递归算法

2017年12月19日 ⁄ 综合 ⁄ 共 1268字 ⁄ 字号 评论关闭

 

  1. //N个数全排列的非递归算法   
  2. #include"stdio.h"   
  3. void swap(int &a, int &b)   
  4. {   
  5.     int temp;   
  6.     temp = a;   
  7.     a = b;   
  8.     b = temp;   
  9. }   
  10. /*   
  11. 根据当前的排列p,计算下一个排列。   
  12. 原则是从1234–>4321,若p已经是最后一个排列,传回false,否则传回true。   
  13. p是一个n维向量。   
  14. */   
  15. bool nextPermutation(int *p, int n)   
  16. {   
  17.     int last=n-1;   
  18.     int i,j,k;   
  19.     //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。   
  20.     i=last;   
  21.     while(i>0&&p[i]<p[i-1])   
  22.         i--;   
  23.     //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回false。   
  24.     if(i==0)   
  25.         return false;   
  26.     //从后查到i,查找大于p[i - 1]的最小的数,记入k   
  27.     k=i;   
  28.     for(j=last;j>=i;j--)   
  29.         if(p[j]>p[i-1]&&p[j]<p[k])   
  30.             k =j;   
  31.         //交换p[k]和p[i - 1]   
  32.         swap(p[k],p[i-1]);   
  33.         //倒置p[last]到p[i]   
  34.         for (j =last,k =i;j>k;j--,k++)   
  35.             swap(p[j],p[k]);   
  36.         return true;   
  37. }   
  38. //显示一个排列   
  39. void showPermutation(int *p, int n)   
  40. {   
  41.     for(int i=0;i<n;i++)   
  42.         printf("%d ",p[i]);   
  43.     printf("\n");  
  44. }   
  45. int main(int argc, char *argv[])   
  46. {   
  47.     int n;   
  48.     int *p;   
  49.     scanf("%d",&n);   
  50.     p = new int[n];   
  51.     for (int i = 0; i < n; i++)   
  52.         p[i] = i + 1;   
  53.     showPermutation(p, n);   
  54.     while(nextPermutation(p, n))   
  55.     {   
  56.         showPermutation(p, n);   
  57.     }   
  58.     //delete[] p;   
  59.     return 0;   
  60. }  

 

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/702551

抱歉!评论已关闭.