Cod sursa(job #649440)

Utilizator andreioneaAndrei Onea andreionea Data 16 decembrie 2011 01:45:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
#define INFILE "algsort.in"
#define OUTFILE "algsort.out"

using namespace std;

void siftUp(vector<int> &v, int i, int j)
{
	int x = j;
	while (x > i) {
		int parinte = (x - 1) >> 1; 
	
		if (v[parinte] < v[x]) {

			v[parinte] ^= v[x];
			v[x] ^= v[parinte];
			v[parinte] ^= v[x];
			

			x = parinte;
		}
		else 
			return;
	}
}
void siftDown(vector<int> &v, int i, int j)
{
	int x = i;
	while ( x*2 + 1 <= j) {
		int copil = x * 2 + 1;
		int swap = x;
		if (v[swap] < v[copil])
			swap = copil;
		if (copil+1 <= j && v[swap] < v[copil+1])
			swap = copil + 1;
		if (swap != x) {
			v[swap] ^= v[x];
			v[x] ^= v[swap];
			v[swap] ^= v[x];
			x = swap;
		}
		else return;
	}
}

void heapify(vector<int> &v, int i)
{
	for(int k = 1; k < i; ++k)
		siftUp(v, 0, k);
}

void heapsort(vector<int> &v)
{
	int x, n = v.size();
	heapify(v, n);
	
	for(int i = 0; i<n-1; ++i){
		x = n - i - 1;
		v[0] ^= v[x];
		v[x] ^= v[0];
		v[0] ^= v[x];
		siftDown(v, 0, x-1);
	}

}

int main()
{
	vector<int> v;
	int n;
	
	ifstream fin(INFILE);
	ofstream fout(OUTFILE);
	fin >> n;
	v.reserve(n);
	for(int i = 0; i<n; ++i){
		int k;
		fin >> k;
		v.push_back(k);
	}
	
	heapsort(v);
	for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
		fout << *it << " ";
	
	fin.close();
	fout.close();
	
	return 0;
}