Cod sursa(job #1621860)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 29 februarie 2016 22:19:29
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <vector>
#include <iostream>
#include <fstream>
#include <deque>
#include <algorithm>
#include <iterator>
using namespace std;

template <typename It>
void do_merge(It st, It dr){
	It mij = st + (dr-st)/2;
	vector<int> tmp(dr-st, 0);
	merge(st, mij, mij, dr, tmp.begin());
	copy(tmp.begin(), tmp.end(), st); }

void in_place_merge_sort(const int n, vector<int>& v){
	// presupunem ca n e putere a lui 2
	// il indexam pe v de la 1
	for(int i = 1; i <= n; ++i){
		const int sz = i&-i;

		for(int j = 2; j <= sz; j *= 2){
			do_merge(v.begin() + i - j + 1, v.begin() + i+1); } } }

int main(){
	ifstream f("algsort.in");
	ofstream g("algsort.out");
	int n;
	f >> n;

	int n_fin = 1<<(int)ceil(log2(n));

	vector<int> v(n_fin+1, 0);

	int maxim = 0;
	for(int i = 1; i <= n; ++i){
		f >> v[i];
		maxim = max(maxim, v[i]); }

	for(int i = n+1; i <= n_fin; ++i){
		v[i] = maxim; }

	in_place_merge_sort(n_fin, v);

	for(int i = 1; i <= n; ++i){
		g << v[i] << ' '; }

	return 0; }