Pagini recente » Cod sursa (job #610824) | Cod sursa (job #2379288) | Cod sursa (job #2212130) | Cod sursa (job #335015) | Cod sursa (job #2669704)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 500000
void merge2(int v[], int start, int mid, int end){
int n1 = mid - start + 1, n2 = end - mid;
int left[n1], right[n2];
for (int i = 0; i < n1; i ++) left[i] = v[i + start];
for (int i = 0; i < n2; i ++) right[i] = v[mid + i + 1];
int i1, i2;
i1 = i2 = 0;
int ind = start;
while (i1 < n1 && i2 < n2){
while (i1 < n1 && left[i1] <= right[i2]) v[ind ++] = left[i1 ++];
while (i2 < n2 && right[i2] < left[i1]) v[ind ++] = right[i2 ++];
}
while (i1 < n1 && left[i1] <= right[i2]) v[ind ++] = left[i1 ++];
while (i2 < n2 && right[i2] < left[i1]) v[ind ++] = right[i2 ++];
}
void mergesort(int v[], int start, int end){
if (start == end) return;
int mid = (start + end) / 2;
mergesort(v, start, mid);
mergesort(v, mid + 1, end);
merge2(v, start, mid, end);
}
int v[NMAX];
int main()
{
FILE *fin, *fout;
fin = fopen("algsort.in", "r");
fout = fopen("algsort.out", "w");
int n;
fscanf(fin, "%d", &n);
for (int i = 0; i < n; i++) fscanf(fin, "%d", &v[i]);
merge2(v, 0, 3, 5);
mergesort(v, 0, n-1);
for (int i = 0; i < n; i++) fprintf(fout, "%d ", v[i]);
return 0;
}