Pagini recente » Cod sursa (job #1826040) | Cod sursa (job #1131750) | Cod sursa (job #1640482) | Cod sursa (job #1332914) | Cod sursa (job #649440)
Cod sursa(job #649440)
#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;
}