Cod sursa(job #1521333)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 10 noiembrie 2015 10:42:54
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include <cstdio>
#include <vector>

std::vector<int> vec;

void mergeSort(int left, int right) {
	if (left >= right) {
		return;
	}
	int mid = (left + right) / 2;
	mergeSort(left, mid);
	mergeSort(mid + 1, right);

	std::vector<int> temp;
	int i = left;
	int j = mid + 1;

	while (true) {
		if (i <= mid && (j > right || vec[i] < vec[j])) {
			temp.push_back(vec[i++]);
			continue;			
		}
		if (j > right && i > mid) {
			break;
		}
		temp.push_back(vec[j++]);
	}

	for (i = left; i <= right; ++i) {
		vec[i] = temp[i - left];
	}

}

void insertionSort() {
	for (int i = 0; i < vec.size(); ++i) {
		for (int j = i; j > 0 && vec[j] < vec[j - 1]; --j) {
			int temp = vec[j];
			vec[j] = vec[j - 1];
			vec[j - 1] = temp;
		}
	}
}

void heapSort() {
	int n = vec.size();

	for (int i = 0; i < n; ++i) {
		for (int j = i + 1; j / 2 != 0 && vec[j - 1] > vec[j / 2 - 1]; j /= 2) {
			int temp = vec[j - 1];
			vec[j - 1] = vec[j / 2 - 1];
			vec[j / 2 - 1] = temp;
		}
	}

	for (int i = 0; i < n; ++i) {
		int temp = vec[n - i - 1];
		vec[n - i - 1] = vec[0];
		vec[0] = temp;
		for (int j = 1; ;) {
			bool left = false;
			bool right = false;
			if (j * 2 - 1 < n - i - 1 && vec[j - 1] < vec[j * 2 - 1]) {
				left = true;
			}
			if (j * 2 < n - i - 1 && vec[j * 2] > vec[j * 2 - 1] && vec[j - 1] < vec[j * 2]) {
				right = true;
			}
			if (!left && !right) {
				break;
			}
			int toChange = right ? j * 2 : j * 2 - 1;
			int temp = vec[toChange];
			vec[toChange] = vec[j - 1];
			vec[j - 1] = temp;
			j = toChange + 1;
		}
	}
}

void quickSort(int left, int right) {
	if (left >= right) {
		return;
	}
	int piv = vec[right];
	int i = left;
	for (int j = left; j < right; ++j) {
		if (vec[j] < piv) {
			int temp = vec[j];
			vec[j] = vec[i];
			vec[i] = temp;
			++i;
		}
	}
	int temp = vec[i];
	vec[i] = vec[right];
	vec[right] = temp;
	quickSort(left, i - 1);
	quickSort(i + 1, right);
}

int main() {
	FILE *f = fopen("algsort.in", "r");
	FILE *g = fopen("algsort.out", "w");
	int n;
	fscanf(f, "%d", &n);
	for (int i = 0; i < n; ++i) {
		int nr;
		fscanf(f, "%d", &nr);
		vec.push_back(nr);
	}
	// mergeSort(0, vec.size() - 1);
	// insertionSort();
	// heapSort();
	quickSort(0, vec.size() - 1);
	for (int i = 0; i < n; ++i) {
		fprintf(g, "%d ", vec[i]);
	}
	fprintf(g, "\n");
	fclose(f);
	fclose(g);
	return 0; 
}