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("\n");  
  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值