Cod sursa(job #966340)

Utilizator Theorytheo .c Theory Data 25 iunie 2013 19:06:49
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
//mergesort

#include <fstream>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");


const int Nmax = 500009;

int N; int A[Nmax];

void Read(){

    fin >> N;

    for(int i = 1; i <= N; ++i)
        fin >> A[i];
}

void Combine(int A[], int Left, int Mid, int Right){

    int L = Left; int B[Nmax]; int M = Mid;


    for(int i = L; i <= Right; ++i){

        if(Left == M){
            B[i] = A[Mid++];
            continue;
        }

        if(Mid == Right + 1){
            B[i] = A[Left++];
            continue;
        }

        if(A[Left] >= A[Mid] )
            B[i] = A[Mid++];
        else B[i] = A[Left++];
    }

    for(int i = L; i <= Right; ++i) A[i] = B[i];
}

void Divide(int A[], int Left, int Right){

    int Mid = ((Left + Right) >> 1);

    if(Right <= Left) return ;

    Divide (A, Left, Mid);
    Divide (A, Mid + 1, Right);

    Combine (A, Left, Mid + 1, Right);
}


void Print (){

    for(int i = 1; i <= N; ++i)
        fout << A[i] <<" ";
}


int main(){

    Read ();

    Divide (A, 1, N);

    Print ();
    return 0;
}