Pagini recente » Cod sursa (job #1218293) | Cod sursa (job #3248240) | Cod sursa (job #1418660) | Cod sursa (job #675653) | Cod sursa (job #1206896)
#include<stdio.h>
int N, *A;
FILE *in, *out;
void read(){
in = fopen("algsort.in", "rt");
out = fopen("algsort.out", "wt");
fscanf(in, "%d", &N);
A = new int[N];
for (int i = 0; i < N; i++)
fscanf(in, "%d", &A[i]);
}
int* merge(int *a, int *b, int n, int m){
int *result = new int[n + m + 1], i = 0, j = 0, k = 0;
while (i < n && j < m){
if (a[i] < b[j]){
result[k] = a[i];
i++;
}
else if (a[i] > b[j]){
result[k] = b[j];
j++;
}
else if (a[i] == b[j]){
result[k] = a[i];
result[k + 1] = b[j];
i++; j++; k++;
}
k++;
}
while (i < n){
result[k] = a[i];
i++; k++;
}
while (j < m){
result[k] = b[j];
j++; k++;
}
return result;
}
void mergesort(int left, int right){
if (left == right) return;
int middle = (left + right) / 2;
mergesort(left, middle);
mergesort(middle + 1, right);
int *merged = merge(A + left, A + middle + 1, middle - left + 1, right - middle);
for (int i = left; i <= right; i++)
A[i] = merged[i - left];
delete[] merged;
}
void print(){
for (int i = 0; i < N; i++){
fprintf(out, "%d ", A[i]);
}
}
int main(){
read();
mergesort(0, N-1);
print();
return 0;
}