Pagini recente » Cod sursa (job #3203757) | Cod sursa (job #929543) | Cod sursa (job #990514) | Cod sursa (job #3206843) | Cod sursa (job #1207110)
#include<stdio.h>
FILE *in, *out;
int N, *A;
void open()
{
in = fopen("algsort.in", "rt");
out = fopen("algsort.out", "wt");
}
void read()
{
fscanf(in, "%d", &N);
A = new int[N + 5];
for (int i = 0; i < N; i++)
fscanf(in, "%d", &A[i]);
}
void merge(int a_left, int a_right, int b_left, int b_right)
{
int *r = new int[b_right - a_left + 1], i = a_left, j = b_left, k = 0;
while (i <= a_right && j <= b_right)
{
if (A[i] == A[j])
{
r[k] = A[i];
r[k + 1] = A[j];
k += 2, i++, j++;
}
else if (A[i] < A[j])
{
r[k] = A[i];
k++, i++;
}
else if (A[i] > A[j])
{
r[k] = A[j];
k++, j++;
}
}
while (i <= a_right)
{
r[k] = A[i];
i++, k++;
}
while (j <= b_right)
{
r[k] = A[j];
j++, k++;
}
for (i = 0; i < k; i++)
{
A[a_left + i] = r[i];
}
delete[] r;
}
void mergesort(int left, int right)
{
if (left == right) return;
int middle = (left + right) / 2;
mergesort(left, middle);
mergesort(middle + 1, right);
merge(left, middle, middle + 1, right);
}
void write()
{
for (int i = 0; i < N; i++)
fprintf(out, "%d ", A[i]);
}
int main()
{
open();
read();
mergesort(0, N - 1);
write();
return 0;
}