Cod sursa(job #612101)

Utilizator bloombergAlex Pacurariu bloomberg Data 5 septembrie 2011 19:45:14
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
//mergesort
#define N 500005
#include <stdio.h>

int A[N];
int MergeAux[N];
int n;

using namespace std;

void Read() {
    freopen("sortare.in","r",stdin);
    freopen("sortare.out","w",stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
     scanf("%d",&A[i]);
    return;
}
void MergeArrays(int start, int middle, int end) {
    int keepStart = start;
    int firstEnd = middle;
    int secStart = middle + 1;
    int auxIndex = 1;
    while((start <= firstEnd) && (secStart <= end)) {
        if (A[start] < A[secStart]) {
            MergeAux[auxIndex++] = A[start];
            start++;
        }
        else {
            MergeAux[auxIndex++] = A[secStart];
            secStart++;
        }
    }
    while(start <= firstEnd) {
        MergeAux[auxIndex++] = A[start];
        start++;
    }
    while(secStart <= end) {
        MergeAux[auxIndex++] = A[secStart];
        secStart++;
    }
    for(int i = 1; i < auxIndex; i++)
     A[keepStart + i - 1] = MergeAux[i];
}
void Mergesort(int st, int dr) {
    if (st != dr) {
        int mij = (st + dr) / 2;
        Mergesort(st, mij);
        Mergesort(mij + 1, dr);
        MergeArrays(st, mij, dr);
    }
}
void Write() {
    for(int i = 1; i <= n; i++)
     printf("%d ", A[i]);
}
int main()
{
    Read();
    Mergesort(1, n);
    Write();
    return 0;
}