#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void intercala(int *A, int p, int q, int r)
{
int pilha1, pilha2, i, j, k;
int *L;
int *R;
pilha1 = q - p + 1;
pilha2 = r - q;
L = (int*)malloc(sizeof(int) * pilha1 + 1);
R = (int*)malloc(sizeof(int) * pilha2 + 1);
i = 1;
j = 1;
k = 0;
k = p;
for(i = 0; i < pilha1; i++)
{
L[i] = A[p + i];
}
for(j = 0; j < pilha2; j++)
{
R[j] = A[q + 1 + j];
}
L[pilha1] = INT_MAX;
R[pilha2] = INT_MAX;
for(k = p; k <= r; k++)
{
if(L[i] < R[j])
{
A[k] = L[i];
i = i + 1;
}
else
{
A[k] = R[j];
j = j + 1;
}
}
}
void merge_sort(int * A, int p, int r)
{
if(p < r)
{
int q;
q = ((p + r) / 2);
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
intercala(A, p, q, r);
}
}
int main()
{
int i, k;
int *A;
printf("Digite o tamanho da entrada:\n");
scanf("%d", &k);
A = (int*)malloc(sizeof(int) * k);
printf("Digite os numeros:\n");
for(i = 0; i < k; i++)
{
scanf("%d", &A[i]);
}
merge_sort(A, 0 , k - 1);
for(i = 0; i < k; i++)
{
printf("%d\n", A[i]);
}
return 0;
}