Cod sursa(job #2271008)

Utilizator mihaicivMihai Vlad mihaiciv Data 27 octombrie 2018 21:08:34
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 500000

void mergeSort(int, int, int *);
void mergeElements(int, int, int*);

int main() {

    FILE *f, *g;
    f = freopen("algsort.in", "r", stdin);
    g = freopen("algsort.out", "w", stdout);

    int n;
    scanf("%d", &n);

    int *v = malloc( NMAX * sizeof(int) );

    int i;
    for (i = 0; i <  n; ++i) {
        scanf("%d", &v[i]);
    }



    mergeSort(0, n - 1, v);



    for (i = 0; i < n; ++i) {
        printf("%d ", v[i]);
    }

    return 0;
}


void mergeSort(int st, int dr, int *v) {
    if (st < dr) {
        int mij =  ( st + dr ) / 2;
        mergeSort(st, mij, v);
        mergeSort(mij + 1, dr, v);
        mergeElements(st, dr, v);
    }
}

void mergeElements(int st, int dr, int *v) {

    int *auxArray = malloc( (dr - st + 3) * sizeof(int) );

    int pos = 0;
    int sPos = st;
    int mij = ( st + dr ) / 2;
    int dPos = mij + 1;

    for (pos = 0; pos < (dr - st + 1); ++pos) {
        if (dPos == dr + 1) {
            auxArray[pos] = v[sPos];
            sPos ++;
        } else if (sPos == mij + 1) {
            auxArray[pos] = v[dPos];
            dPos ++;
        } else {
            if (v[sPos] < v[dPos] ) {
                auxArray[pos] = v[sPos];
                sPos ++;
            } else {
                auxArray[pos] = v[dPos];
                dPos ++;
            }
        }
    }
    int i;
    for (i = 0; i < pos; ++i) {
        v[st + i] = auxArray[i];
    }

    free(auxArray);

}