Cod sursa(job #1451755)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 18 iunie 2015 14:21:56
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

vector<vector<int> >seq;
vector<int> aux,V;
int N,val;

void Read()
{
    scanf("%d",&N);
    seq.push_back(aux);
    V.resize(N);
    for(int i = 0; i < N; ++i)
        scanf("%d",&V[i]);
    int crt = 0,i,j;
    while(crt < N){

        i = crt;
        j = crt;

        while(i+1 < N && V[i] < V[i+1])++i;
        while(j+1 < N && V[j] > V[j+1])++j;

        if(i > j){
            aux.resize(i-crt+1);
            for(int k = crt; k <= i; ++k)
                aux[k-crt] = V[k];
            seq.push_back(aux);
            crt = i + 1;
            continue;
        }

        aux.resize(j-crt+1);
        for(int k = crt; k <= j; ++k)
            aux[k-crt] = V[k];
        reverse(aux.begin(),aux.end());
        seq.push_back(aux);
        crt = j + 1;
    }
}

void Seq_merge_sort(int li,int lf)
{
    if(li == lf)
        return;
    int m = li + ((lf - li) >> 1);

    Seq_merge_sort(li,m);
    Seq_merge_sort(m+1,lf);

    aux.resize(seq[li].size() + seq[m+1].size());
    merge(seq[li].begin(),seq[li].end(),seq[m+1].begin(),seq[m+1].end(),aux.begin());
    seq[li] = aux;
    aux.resize(0);
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);

    Read();
    Seq_merge_sort(1,(int)seq.size()-1);
    for(auto it : seq[1])
        printf("%d ",it);

    return 0;
}