- #include<stdio.h>
- void swap(int *p,int *q) ///传入的是地址
- {
- int m;
- m = *p;
- *p = *q;
- *q = m;
- }
- void sort(int s[], int x) ///传入数组地址
- {
- int i,j,flag=1;
- int t;
- for(i=0; i<x-1 && flag ==1; i++)
- {
- flag=0;
- for(j=0; j<x-i-1; j++)
- {
- if(s[j] > s[j+1])
- {
- t = s[j];
- s[j] = s[j+1];
- s[j+1] = t;
- flag = 1;
- }
- }
- }
- }
- int main()
- {
- int i,j,n,s[10];
- scanf("%d",&n);
- for(i=0;i<n;i++)
- {
- s[i]=i+1;
- }
- while(1)
- {
- for(i=0;i<n;i++)
- {
- printf("%d ",s[i]);
- }
- printf(" ");
- for(i=n-2;i>=0 && s[i]>=s[i+1]; i--)
- {
- }
- if(i<0)
- break;
- for(j=n-1;i<j && s[j]<=s[i];j--)
- {
- }
- swap(&s[i], &s[j]);
- i++;
- j=n-1;
- while(i<j)
- {
- swap(&s[i++], &s[j--]);
- }
- }
- return 0;
- }
找规律: 比如如何确定 31976 的 下一位是 36179
先从后往前找 找到第一个减小的位置 如9到1 记1的位置为 i
从i开始往后找找到第一个增大的位置 记为j 如果没有则j为最后一位
交换 i 和 j 位置的数 为36971
之后 再将i后面的数逆序 为36179