首页 > 代码库 > POJ 1833 排序

POJ 1833 排序

http://poj.org/problem?id=1833

题意:

给出一个排序,求出它之后的第k个排序。

 

思路:

排序原理:

1、如果全部为逆序时,说明已经全部排完了,此时回到1~n的排序。

2、从后往前找到第一对 ai<ai+1,然后从i+1~n寻找比ai大的最小的数并与之互换,之后再对i+1~n的数进行排序即可。

 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 10 const int maxn=105;11 12 int n,k;13 int a[1025];14 15 void solve()16 {17     int i;18     for(i=n-2;i>=0;i--)19         if(a[i]<a[i+1])   break;20     if(i==-1)21     {22         sort(a,a+n);23         return;24     }25     int MIN=0x3f3f3f;26     int k;27     for(int j=i+1;j<n;j++)28     {29         if(a[j]>a[i] && a[j]<MIN)30         {31             MIN=a[j];32             k=j;33         }34     }35 36     int temp=a[i];37     a[i]=a[k];38     a[k]=temp;39 40     sort(a+i+1,a+n);41 }42 43 44 int main()45 {46     //freopen("D:\\input.txt","r",stdin);47     int T;48     scanf("%d",&T);49     while(T--)50     {51         scanf("%d%d",&n,&k);52         for(int i=0;i<n;i++)53             scanf("%d",&a[i]);54         while(k--)   solve();55         for(int i=0;i<n;i++)56         {57             if(i)  printf(" ");58             printf("%d",a[i]);59         }60         printf("\n");61     }62 }

 

POJ 1833 排序