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;
}

 

posted @ 2014-06-04 01:42  Naturain  阅读(106)  评论(0编辑  收藏  举报