7.5 字典序全排列

  1.       #include<stdio.h>    
  2. void swap(int *p,int *q)    ///传入的是地址
  3. {    
  4.     int m;    
  5.     m = *p;    
  6.     *p = *q;    
  7.     *q = m;    
  8. }    
  9.     
  10. void sort(int s[], int x)    ///传入数组地址
  11. {    
  12.     int i,j,flag=1;    
  13.     int t;    
  14.     for(i=0; i<x-1 && flag ==1; i++)    
  15.     {    
  16.         flag=0;    
  17.         for(j=0; j<x-i-1; j++)    
  18.         {    
  19.             if(s[j] > s[j+1])    
  20.             {    
  21.                 t = s[j];    
  22.                 s[j] = s[j+1];    
  23.                 s[j+1] = t;    
  24.                 flag = 1;    
  25.             }    
  26.         }    
  27.     }    
  28.     
  29. }    
  30.     
  31. int main()    
  32. {    
  33.     int i,j,n,s[10];    
  34.     scanf("%d",&n);    
  35.     for(i=0;i<n;i++)  
  36.     {  
  37.         s[i]=i+1;  
  38.     }  
  39.     while(1)    
  40.     {    
  41.            for(i=0;i<n;i++)  
  42.     {  
  43.         printf("%d ",s[i]);  
  44.     }  
  45.     printf(" ");  
  46.         for(i=n-2;i>=0 && s[i]>=s[i+1]; i--)     
  47.         {                                    
  48.         }    
  49.         if(i<0)    
  50.             break;    
  51.         for(j=n-1;i<j && s[j]<=s[i];j--)    
  52.         {    
  53.         }    
  54.             
  55.         swap(&s[i], &s[j]);   
  56.         i++;        
  57.         j=n-1;     
  58.         while(i<j)    
  59.         {    
  60.             swap(&s[i++], &s[j--]);    
  61.         }    
  62.             
  63.     }    
  64.     return 0;    
  65. }    

找规律:   比如如何确定 31976 的 下一位是 36179

              先从后往前找 找到第一个减小的位置 如9到1   记1的位置为 i

                 从i开始往后找找到第一个增大的位置 记为j  如果没有则j为最后一位

             交换 i 和 j 位置的数 为36971

           之后 再将i后面的数逆序  为36179

原文地址:https://www.cnblogs.com/wshyj/p/6101086.html