Cod sursa(job #1206896)

Utilizator an_drey_curentandreycurent an_drey_curent Data 11 iulie 2014 14:05:37
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#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;
}