Pagini recente » Cod sursa (job #2821291) | Cod sursa (job #2052249) | Cod sursa (job #1131314) | Cod sursa (job #1856892) | Cod sursa (job #2271008)
#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);
}