Uva--120 (排序)
2014-06-04 01:40:03
题意&思路:变相的冒泡排序,交换的方式比较奇特。思路是逐个找剩余元素中的最大值,并把它转到第一,再转到剩余元素的最后一个,如:51234,把5转到最后;再如15234,把5转到第一,51234再转到最后。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn = 100; void Flip(int *v,int r){ int mid = (1 + r) / 2; for(int i = 1; i <= mid; ++i){ int temp = v[i]; v[i] = v[r - i + 1]; v[r - i + 1] = temp; } } int main(){ int v[maxn + 5],cnt = 0,n; char c; memset(v,0,sizeof(v)); while(scanf("%d%c",&n,&c) == 2){ printf("%d%c",n,c); ++cnt; v[cnt] = n; if(c == '\n'){ for(int i = 1; i <= cnt; ++i){ int tmax = 0,pos; for(int j = 1; j <= cnt - i + 1; ++j){ if(v[j] > tmax){ tmax = v[j]; pos = j; } } if(pos != cnt - i + 1){ //最大位置 if(pos != 1){ Flip(v,pos); printf("%d ",cnt - pos + 1); } Flip(v,cnt - i + 1); printf("%d ",i); } } printf("0\n"); cnt = 0; memset(v,0,sizeof(v)); } } return 0; }